Java併發-執行緒安全的集合類

weixin_34006468發表於2018-05-21

注意,此處所提供的程式碼,都是基於JDK1.8版本,部分程式碼與之前版本存在較大差異

1、Hashtable:通過synchronized關鍵字保證執行緒安全

2、ConcurrentHashMap:效率比Hashtable高,主要體現在前者使用了鎖分離技術,即程式碼塊鎖,而不是方法鎖

    保證執行緒安全的方法(JDK1.8中):在ConcurrentHashMap中,隨處可以看到U, 大量使用了U.compareAndSwapXXX的方法,這個方法是利用一個CAS演算法實現無鎖化的修改值的操作,他可以大大降低鎖代理的效能消耗。這個演算法的基本思想就是不斷地去比較當前記憶體中的變數值與你指定的一個變數值是否相等,如果相等,則接受你指定的修改的值,否則拒絕你的操作。因為當前執行緒中的值已經不是最新的值,你的修改很可能會覆蓋掉其他執行緒修改的結果。這一點與樂觀鎖,SVN的思想是比較類似的。

3、CopyOnWriteArrayList:實現原理比較簡單,就是利用之前寫過的Java中的鎖ReentrantLock進行加鎖處理,寫操作進行加鎖處理,讀操作則是利用複製容器的方式

4、CopyOnWriteArraySet:CopyOnWriteArrayList的裝飾器模式

        CopyOnWrite容器,即寫時複製的容器,通俗理解就是當我們往一個容器中新增元素的時候,不直接往當前容器中新增,而是先將當前容器進行copy,複製出一個新的容器,然後新的容器裡面新增元素,新增完元素之後,再將原容器的引用指向新的容器,這樣做的好處是我們可以對CopyOnWrite容器進行併發的讀,而不需要加鎖,因為當前容器不會新增任何元素,但是新增元素的時候需要加鎖,防止多個併發執行緒搞出多個複製容器來

        所以CopyOnWrite容器比較多用於讀多寫少的併發場景,比如白名單,黑名單,商品類目的訪問和更新等場景,

        CopyOnWrite的注意:

            1、減少擴容開銷

            2、儘可能使用批量新增

        CopyOnWrite的缺點:

            1、記憶體佔用,複製容器的時候同時存在兩個容器,而且寫完之後,由於垃圾處理機制的原因,原容器可能還會留存一段時間

            2、資料一致性問題,只能保證資料的最終一致性,不能保證資料的實時一致性

5、Vector 向量佇列,實現了List,通過synchronized關鍵字保證執行緒安全,跟Hashtable類似

6、StringBuffer和StringBuilder中,Stringbuffer是執行緒安全的,通過synchronized關鍵字保證執行緒安全。

最後複製貼上一些關於CAS的文章連結,感覺說的挺好的

https://blog.csdn.net/hsuxu/article/details/9467651

相關文章