對於那些會以多線程運行的單例類(比如spring mvc中的controller,dao,service):
局部變量不會受多線程影響
成員變量會受到多線程影響
如果方法里有成員變量,只有讀操作,不受影響;存在寫操作,考慮多線程影響值。
例如Web應用中的Servlet,每個方法中對局部變量的操作都是在線程自己獨立的內存區域內完成的,所以是線程安全的。
而web中每個請求都是單獨的線程,即使同時訪問同一個Controller對象,因為並沒有修改Controller對象,相當於針對Controller對象而言,只是讀操作,沒有寫操作,因此不需要做同步處理。
Service層、Dao層用默認singleton就行。雖然Service類也有dao這樣的屬性,但dao這些類都是沒有狀態信息的,也就是 相當於不變(immutable)類,所以不影響。
這樣spring mvc的速度當然比struts2要快,但是也無法使用全局變量。
那么,如果我們要使用全局變量,這里提供2種方式:
第一種將controller的作用域由單例改為原型,在controller上加上注解:@Scope("prototype")
這樣每有一個請求訪問,都會新建一個controller,缺點是速度會變慢。
第二種是將controller的范圍設置成會話級別(session),並加入一個初始化全局變量的方法,在方法上加上注解:@postContruct,它在bean初始化時執行。
這樣我們就會在每個請求來的時候,新建一個全局變量(例如下面例子中的list):
例:(參考:https://blog.csdn.net/weixin_33387378/article/details/87933743)
@Controller @Scope("session") public class XxxController{ private List<String> list ; //當bean加載完之后,就會執行init方法,並且將list實例化; @PostConstruct public void init(){ list = new ArrayList<String>(); } }
