1. 程式人生 > >執行緒安全的集合類、CopyOnWrite機制介紹(轉)

執行緒安全的集合類、CopyOnWrite機制介紹(轉)

看過併發程式設計的書,這兩種機制都有所瞭解,但不紮實其實。看到別人的部落格描述的很精闢,於是轉過來,感謝!

原文連結:https://blog.csdn.net/yen_csdn/article/details/51705687

 

inkedList、ArrayList、HashSet是非執行緒安全的,Vector是執行緒安全的;
HashMap是非執行緒安全的,HashTable是執行緒安全的;

Java.util.concurrent.ConcurrentHashMap
ConcurrentHashMap是HashMap的執行緒安全版(但此類不允許null做鍵或者值),同Hashtable相比,ConcurrentHashMap不僅保證了訪問的執行緒安全性,而且在效率上與Hashtable相比,有較大的提高。ConcurrentHashMap允許多個修改操作併發進行,他使用了鎖分離的技術,即程式碼塊鎖,而不是方法鎖。他使用了多個鎖來控制對hash表的不同部分進行的修改。ConcurrentHashMap內部使用段(Segment)來表示不同的部分,每個段其實就是一個小的hashtable,他們有自己的鎖(ReentrantLock來實現)。只要多個修改發生在不同的段上,他們就可以併發進行。

java.util.concurrent.CopyOnWriteArrayList
CopyOnWriteArrayList中的add、set、remove等方法,都是用了ReentrantLock的lock()來加鎖,unlock()來解鎖。
當增加元素時使用Array.copyOf()來拷貝副本,在副本上增加元素,然後改變原引用指向副本,讀操作不加鎖。適合讀操作遠遠多於寫操作的應用。

java.util.concurrent.CopyOnWriteArraySet
CopyOnWriteArraySet是在CopyOnWriteArrayList的基礎上使用了Java的裝飾模式。
List和Set的區別同樣適用於CopyOnWriteArrayList和CopyOnWriteArrayList。

CopyOnWrite機制介紹
CopyOnWrite容器是 寫時複製的容器,就是我們往容器裡寫東西時,不是直接寫,而是先Copy當前容器,然後往新容器裡新增元素,在將原容器的引用指向新容器。這樣做的好處是:可以併發的讀,而不需要加鎖,因為當前容器不會新增任何元素。CopyOnWrite容器是一種讀寫分離的思想。
應用場景:應用於讀多寫少的併發場景,
注意:減少擴容開銷;使用批量新增(減少複製次數);
缺點:記憶體佔用問題;資料一致性問題(CopyOnWrite機制只能保證最終的資料一致,不能保證實時資料一致,因此如果希望寫入的資料能馬上讀到,就不應該用CopyOnWrite);