P4447 [AHOI2018初中組]分組 貪心
阿新 • • 發佈:2022-03-08
ConcurrentHashMap 執行緒安全的具體實現方式
JDK1.7
1 儲存結構
首先將資料分為一段一段的儲存,然後給每一段資料配一把鎖,當一個執行緒佔用鎖訪問其中一個段資料時,其他段的資料也能被其他執行緒訪問。
ConcurrentHashMap
是由 Segment
陣列結構和 HashEntry
陣列結構組成。
Segment 實現了 ReentrantLock
,所以 Segment
是一種可重入鎖,扮演鎖的角色。HashEntry
用於儲存鍵值對資料
一個 ConcurrentHashMap
裡包含一個 Segment
陣列。Segment
的結構和 HashMap
類似,是一種陣列和連結串列結構,但是 Segment
的個數一旦初始化就不能改變。
一個 Segment
包含一個 HashEntry
陣列,每個 HashEntry
是一個連結串列結構的元素,每個 Segment
守護著一個 HashEntry
數組裡的元素,當對 HashEntry
陣列的資料進行修改時,必須首先獲得對應的 Segment
的鎖。
初始化
- 必要引數校驗。
- 校驗併發級別 concurrencyLevel 大小,如果大於最大值,重置為最大值。無參構造預設值是 16.
- 尋找併發級別 concurrencyLevel 之上最近的 2 的冪次方值,作為初始化容量大小,預設是 16。
- 記錄 segmentShift 偏移量,這個值為【容量 = 2 的N次方】中的 N,在後面 Put 時計算位置時會用到。預設是 32 - sshift = 28.
- 記錄 segmentMask,預設是 ssize - 1 = 16 -1 = 15.
- 初始化 segments[0],預設大小為 2,負載因子 0.75,擴容閥值是 2*0.75=1.5,插入第二個值時才會進行擴容。
put
-
計算要 put 的 key 的位置,獲取指定位置的 Segment。
-
如果指定位置的 Segment 為空,則初始化這個 Segment.初始化 Segment 流程:
3. Segment.put 插入 key,value 值。
- .
JDK1.8