線程總結

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  寫入時複製 ,新建一個容器, 適合遍歷多的狀況,例如觀察者模式遍歷通知

相關文章
相關標籤/搜索