1. 程式人生 > 其它 >P4447 [AHOI2018初中組]分組 貪心

P4447 [AHOI2018初中組]分組 貪心

ConcurrentHashMap 執行緒安全的具體實現方式

JDK1.7

1 儲存結構

 

 

 

首先將資料分為一段一段的儲存,然後給每一段資料配一把鎖,當一個執行緒佔用鎖訪問其中一個段資料時,其他段的資料也能被其他執行緒訪問。

ConcurrentHashMap 是由 Segment 陣列結構和 HashEntry 陣列結構組成。

Segment 實現了 ReentrantLock,所以 Segment 是一種可重入鎖,扮演鎖的角色。HashEntry 用於儲存鍵值對資料

一個 ConcurrentHashMap 裡包含一個 Segment 陣列。Segment 的結構和 HashMap

 類似,是一種陣列和連結串列結構,但是 Segment 的個數一旦初始化就不能改變

一個 Segment 包含一個 HashEntry 陣列,每個 HashEntry 是一個連結串列結構的元素,每個 Segment 守護著一個 HashEntry 數組裡的元素,當對 HashEntry 陣列的資料進行修改時,必須首先獲得對應的 Segment 的鎖。

 

初始化

  1. 必要引數校驗。
  2. 校驗併發級別 concurrencyLevel 大小,如果大於最大值,重置為最大值。無參構造預設值是 16.
  3. 尋找併發級別 concurrencyLevel 之上最近的 2 的冪次方值,作為初始化容量大小,預設是 16。
  4. 記錄 segmentShift 偏移量,這個值為【容量 = 2 的N次方】中的 N,在後面 Put 時計算位置時會用到。預設是 32 - sshift = 28.
  5. 記錄 segmentMask,預設是 ssize - 1 = 16 -1 = 15.
  6. 初始化 segments[0],預設大小為 2,負載因子 0.75,擴容閥值是 2*0.75=1.5,插入第二個值時才會進行擴容。

put

    1. 計算要 put 的 key 的位置,獲取指定位置的 Segment。

    2. 如果指定位置的 Segment 為空,則初始化這個 Segment.初始化 Segment 流程:

    3.      

 

 3. Segment.put 插入 key,value 值。

 

 

 

 

    .     

JDK1.8