HashMap,ConcurrentHashMap與LinkedHashMap的區別
- ConcurrentHashMap是使用了鎖分段技術技術來保證線程安全的,鎖分段技術:首先將數據分成一段一段的存儲,然后給每一段數據配一把鎖,當一個線程占用鎖訪問其中一個段數據的時候,其他段的數據也能被其他線程訪問
- ConcurrentHashMap 是在每個段(segment)中線程安全的
- LinkedHashMap維護一個雙鏈表,可以將里面的數據按寫入的順序讀出
ConcurrentHashMap應用場景
1:ConcurrentHashMap的應用場景是高並發,但是並不能保證線程安全,而同步的HashMap和HashMap的是鎖住整個容器,而加鎖之后ConcurrentHashMap不需要鎖住整個容器,只需要鎖住對應的Segment就好了,所以可以保證高並發同步訪問,提升了效率。
2:可以多線程寫。
ConcurrentHashMap把HashMap分成若干個Segmenet
1.get時,不加鎖,先定位到segment然后在找到頭結點進行讀取操作。而value是volatile變量,所以可以保證在競爭條件時保證讀取最新的值,如果讀到的value是null,則可能正在修改,那么就調用ReadValueUnderLock函數,加鎖保證讀到的數據是正確的。
2.Put時會加鎖,一律添加到hash鏈的頭部。
3.Remove時也會加鎖,由於next是final類型不可改變,所以必須把刪除的節點之前的節點都復制一遍。
4.ConcurrentHashMap允許多個修改操作並發進行,其關鍵在於使用了鎖分離技術。它使用了多個鎖來控制對Hash表的不同Segment進行的修改。
ConcurrentHashMap的應用場景是高並發,但是並不能保證線程安全,而同步的HashMap和HashTable的是鎖住整個容器,而加鎖之后ConcurrentHashMap不需要鎖住整個容器,只需要鎖住對應的segment就好了,所以可以保證高並發同步訪問,提升了效率。
ConcurrentHashMap能夠保證每一次調用都是原子操作,但是並不保證多次調用之間也是原子操作。
友情鏈接:Java集合—ConcurrentHashMap原理分析