http://dadi520.iteye.com/blog/856095
引用: http://jiediax.iteye.com/blog/774265
http://startor.iteye.com/blog/705979
http://www.jdon.com/jivejdon/thread/26846
使用了這麼久的Struts,今天總算把Struts Action的安全執行緒問題研究了一下,在網上查了很多資料,這裡把我理解的總結一下。
先提一個問題:Struts 1.x和Struts 2的Action是不是安全執行緒的?
Struts 1.x在第一次請求某個Action時,會建立這個Action執行個體。但之後再請求該Action執行個體時,就用之前建立好的這個Action處理,即它是單例模式。所以Struts 1.x的Action不是安全執行緒的。
但是為什麼我們在使用Struts 1.x開發的時候一般不用考慮安全執行緒問題呢?
那是因為Struts 1.x的方法調用模式用到的參數一般都是局部變數(包括request, response等,如下面的方法定義),我們用於封裝用戶端請求參數的ActionForm,也是作為一個參數傳入,也屬於局部變數,
局部變數是安全執行緒的,因此不存線上程安全問題。
但是要是在execute中使用了執行個體變數,就會存線上程安全問題。所以我們用Struts 1.x開發時盡量不要使用執行個體變數,
如果一定要用或者有這種需要,那麼我們一定要意識到使用執行個體變數是存線上程安全的,可以使用同步機制去處理安全執行緒問題。
public ActionForward execute (ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws ActionException;總結: struts中的 和Action的執行個體(單例) 會被多個線程同時調用, 所以存在著多個線程共用同一個資源(Action), 所有要注意同步的問題
Struts 2 Action對象為每一個請求產生一個執行個體,因此沒有安全執行緒問題 。
在Sping + Struts 2的應用中,由Spring來管理Struts 2的Action,而IoC容器管理的bean預設是單一實例的
(scope="singleton"),加上Struts 2的Action就像一個POJO一樣,定義了很多的類變數,這就有安全執行緒問題了。解決些問題最簡單的辦法就是不使用單例模式(設定scope="prototype")。
<bean id="testAction" class="com.webapp.action.TestAction" scope="prototype">
引言:
但是,線程同步是不得以的方法,是比較複雜的,而且會帶來效能的損失。等效的代碼中,不需要同步在編寫容易度和效能上會更好些。
我這裡強調的是什麼代碼是始終為安全執行緒的、是不需要同步的。如下:
1)常量始終是安全執行緒的,因為只存在讀操作。
2)對構造器的訪問(new 操作)是安全執行緒的,因為每次都建立一個執行個體,不會訪問共用的資源。
3)最重要的是:局部變數是安全執行緒的。因為每執行一個方法,都會在獨立的空間建立局部變數,它不是共用的資源。局部變數包括方法的參數變數。