1.線程安全安全
線程安全封裝在共享數據內部多線程
共享數據 有狀態值 不在線程棧 加鎖 併發
單個狀態值 現有線程安全類 ,多個狀態值 不變性條件涉及的狀態值 用同一把鎖less
2對象的共享性能
發佈: 對象的引用傳給做用域外。 方法參數 返回值,靜態變量this
逸出:不該該發佈的對象被髮布了。構造方法中建立內部類實例,啓動線程,擁有不完整this。prototype
安全發佈:線程
①線程封閉: 局部變量(線程棧中) threadlocal對象
②volatile(可見性) + 不可變類 : 想改變只能從新建立對象,並保證可見性作用域
③線程安全共享: 線程內部實現同步
④保護對象:加鎖
第三:Spring中的有狀態(Stateful)和無狀態(Stateless)
1.經過上面的分析,相信你們已經對有狀態和無狀態有了必定的理解。無狀態的Bean適合用不變模式,技術就是單例模式,這樣能夠共享實例,提升性能。有狀態的Bean,多線程環境下不安全,那麼適合用Prototype原型模式。Prototype: 每次對bean的請求都會建立一個新的bean實例。
2.默認狀況下,從Spring bean工廠所取得的實例爲singleton(scope屬性爲singleton),容器只存在一個共享的bean實例。
3.理解了二者的關係,那麼scope選擇的原則就很容易了:有狀態的bean都使用prototype做用域,而對無狀態的bean則應該使用singleton做用域。
4.如Service層、Dao層用默認singleton就行,雖然Service類也有dao這樣的屬性,但dao這些類都是沒有狀態信息的,也就是至關於不變(immutable)類,因此不影響。Struts2中的Action由於會有User、BizEntity這樣的實例對象,是有狀態信息的,在多線程環境下是不安全的,因此Struts2默認的實現是Prototype模式。在Spring中,Struts2的Action中,scope要配成prototype做用域。
同步容器 fail-fast 容器改變 拋出異常 有些操做須要加鎖
併發容器 弱一致性 不拋出異常 併發訪問 效率高
通常用concurrenthashmap ,分段鎖, 併發讀寫不一樣的段,,須要獨佔訪問 用 hashmap, synchronizedmap
copyonwritelist 寫入時複製 ,新建一個容器, 適合遍歷多的狀況,例如觀察者模式遍歷通知