1. 程式人生 > >併發容器總結

併發容器總結

concurrentHashMap基本資料結構

       ConcurrentHashMap在1.8中的實現,相比於1.7的版本基本上全部都變掉了。首先,取消了Segment分段鎖的資料結構,取而代之的是陣列+連結串列(紅黑樹)的結構。而對於鎖的粒度,調整為對每個陣列元素加鎖(Node)(說明:Node不支援修改值,修改會丟擲異常)。然後是定位節點的hash演算法被簡化了,這樣帶來的弊端是Hash衝突會加劇。因此在連結串列節點數量大於8時(小於6會轉回連結串列),會將連結串列轉化為紅黑樹進行儲存(如果當前Node陣列長度小於閾值MIN_TREEIFY_CAPACITY,預設為64,先通過擴大陣列容量為原來的兩倍以緩解單個連結串列元素過大的效能問題)。這樣一來,查詢的時間複雜度就會由原先的O(n)變為O(logN)。預設容量是16,可自定義初始化容量作為構造方法的引數。

擴容過程

擴容過程中,正在擴容的執行緒會將正在轉移的table節點標記為ForwardingNode,其他執行緒若是查詢到某個節點為ForwardingNode型別節點,則查詢下一個talbe節點輔助進行擴容操作,轉移完一個節點,直接將該節點設定為fwd,表示已經遍歷過。每個執行緒負責轉移的陣列區間最少為16,避免發生大量衝突,也就是每個執行緒負責連續的16個table節點的轉移。nextTable指向新陣列,擴容完成後nextTable置null,table指向新陣列,

size() 方法獲取當前Map中物件中的鍵值對個數時,返回的是估算值,不是精確值。

get()操作沒有加鎖,說明是弱一致性。

copyOnWriteArrayList