ConcurrentHashMap隨意分析

Daisytheboy發表於2020-10-14

參考博文

https://www.jianshu.com/p/865c813f2726

繼承關係

繼承了AbstractMap抽象類和ConcurrentMap介面

資料結構

1.7:Segment陣列(每個Segement由陣列和連結串列組成(實際上一個Segement就是一個table陣列,table陣列裡有多個HashBucket,每個HashBucket由一個HashEntry組成 ),Segement是一種可重入鎖ReentrantLock,即分段鎖)。
1.8:拋棄使用Segement,table,由陣列和連結串列和紅黑樹組成,使用CAS和Synchronized關鍵字保證併發的安全。

執行緒安全性

執行緒安全的
JDK1.7裡容器有多把鎖,每一把鎖鎖一段資料(segement陣列,加上HashEntry單向佇列table)
JDK1.8版本:
①取消segments欄位,直接採用transient volatile HashEntry<K,V>[] table儲存資料,採用table陣列元素作為鎖,從而實現了對每一行資料進行加鎖,併發控制使用Synchronized和CAS來操作
將原先table陣列+單向連結串列的資料結構,變更為table陣列+單向連結串列+紅黑樹的結構.

引數

預設容量:16(2的整數倍)
負載因子:0.75
樹化閾值:8
鏈化閾值:6
最小樹化容量:64(指的是table的容量)
容器:Node陣列型別的table

元素存在

不允許空鍵或者空值

相關文章