1. 程式人生 > >SpringMVC和Struts2併發訪問時的執行緒安全問題

SpringMVC和Struts2併發訪問時的執行緒安全問題

SpringMVC是基於方法的攔截,Struts2是基於類的攔截。
Struts2每處理一個請求,就會例項化一個Action物件,所有不會有執行緒安全的問題。
SpringMVC的controller預設是singleton的。
單例的好處:

  1. 不用每次建立controller
  2. 減少建立物件的時間和垃圾收集的時間。

意味著每一個請求,系統都會用原有例項去處理,這樣會導致多執行緒呼叫時,它裡面的例項變數就不是執行緒安全的了。
然而大多數情況我們根本不需要考慮執行緒安全的問題,比如dao,service,除非在bean中宣告的例項變數。因此我們使用SpringMVC的controller是應避免在controller中定義例項變數。
解決方案


1. 使用controller時,避免在controller中定義成員變數。
2. 將controller的作用域改為@Scope=”prototype”。
3. 在controller中使用ThreadLocal變數。

問題:那麼我們的業務物件中的成員變數如,在Dao中的xxxDao,或controller中的xxxService,都會被多個執行緒共享,那麼這些物件不會出現同步問題嗎,比如會造成資料庫的插入,更新異常?
答:這些物件確實是單例的,會出現執行緒同步的問題。雖然這些物件會被多執行緒訪問出現併發問題,但我們其實是訪問他們裡面方法,這些類裡通常不含有成員變數,注入的xxxDao是Mybatis框架封裝好的,已經被測試,不會出現執行緒同步問題了。所以出問題的地方就是我們自己系統裡面的業務 物件,所以我們一定要注意這些業務物件裡面千萬不能要獨立成員變數,否則會出錯。