1. 程式人生 > >ConcurrentHashMap 源碼

ConcurrentHashMap 源碼

null hashmap 和數 ans tno current 位置 導致 情況

1、一個欄位(hashmap數組的一個位置),放置的node有這幾種可能:A----null;B----鏈表的頭節點,這是的hash值和後繼節點的hash值是一樣的,而且和數組位置也是一一對應的,是個正數;C----transfer中,會把hash值為-1(MOVED)的一個firstNode放在這裏,標誌這個位置正在被transfer;D----紅黑樹的TreeBin,繼承了Node,構造函數中給Node的hash值賦值-2. 所以綜合來說,可以根據頭節點的hash值判斷當前欄位的情況。

2、ConcurrentHashMap 是一個線程安全的數據結構,要解決兩個不安全的地方:讀寫沖突,和寫寫(增刪改)沖突。讀是不加鎖的,這點很厲害,也挺有意思值得研究。

  A:transfer的時候,不是像hashmap那樣對一個鏈表進行拆分,這樣會導致讀的時候一路next的時候出現斷裂,而是保持原先的鏈式數據結構不變,擴容後的兩個欄位,對之前的鏈表進行分別引用。(紅黑樹的情況呢?)

ConcurrentHashMap 源碼