一、通過Key找到在Segment[]數(shù)組中的位置:
1. 變量定義:
ssize:
不小于concurrencyLevel的最小2的N次方, 默認(rèn)concurrencyLevel等于16;
segmentShift:
32 - ssize從1左移的位數(shù);
segmentMask:
ssize - 1;
key的hash方法

key的hash方法.png
2. 通過UnSafe獲取Segment[]數(shù)組中下標(biāo)為index的元素的地址

index對應(yīng)的Segment數(shù)組元素.png
3. 將Key放在HashMap的合適位置
3.1 由key確定在Segment[]數(shù)組中的下標(biāo)

key在Segment數(shù)組中的下標(biāo).png
3.2 將Key插入到Segment中的合適的位置
① 獲取key在table中的下標(biāo),記為index。
index = hash & (table.length - 1);
② 取table[index]的頭部HashEntry,記為first。若first == null,表示table的index下標(biāo)位置為null,新建一個(gè)HashEntry放置在table[index]的頭部;若first != null,則進(jìn)入③:
③ 從first開始沿鏈表遍歷,若找到
(e.key == key || (e.hash == hash && key.equals(e.key))
則表示table中key已存在,用value替換oldValue,并返回oldValue;若直到鏈表的末尾也沒找到,則構(gòu)建新的HashEntry插入table[index]的鏈表頭部。
3.3 put操作獲取Segment的自旋鎖的過程

獲取自旋鎖和預(yù)創(chuàng)建節(jié)點(diǎn).png
4. UnSafe的常量

UnSafe常量.png