JDK 1.8 ConcurrentHashMap (二)—— putVal

今天再來(lái)說(shuō)說(shuō)JUC下的HashMap的put方法

上源碼:

put的實(shí)現(xiàn)

趕腳特別長(zhǎng)是不是,其實(shí)拆解來(lái)看并沒(méi)有很復(fù)雜。

沒(méi)工夫的可直接滾輪最后查看完整注釋版。



1、初始化變量,中間看到的initTable是不是很眼熟,就是之前講的initTable 見(jiàn)第一Part

初始化



2、找到對(duì)應(yīng)的位置 tabAt返回的是Node,也是Unsafe獲取的,如果空就直接Cas插入啦。當(dāng)然如果并發(fā)Cas是失敗。失敗后會(huì)在上一個(gè)for中繼續(xù)重試

插入前判斷


Cas插入



3、判斷是否在擴(kuò)容移動(dòng)。這邊擴(kuò)容是concurrentHashMap的精華。我們?nèi)蘸笤敿?xì)分解


moved狀態(tài)



4、接下來(lái)就是位置上有值,使用synchronized 加鎖,先判斷是否是鏈表,如果是那就遍歷去比較,發(fā)現(xiàn)相同的就會(huì)替換,如果沒(méi)有那就在末尾追加。如果Node是紅黑樹(shù)那就調(diào)用紅黑樹(shù)。(ps:紅黑樹(shù)數(shù)據(jù)結(jié)構(gòu)自行查閱資料,涉及不少知識(shí)。包括紅黑樹(shù)的結(jié)構(gòu),樹(shù)的自平衡等等)

Hash一致的情況下



5、在完成上面的put后,就需要檢查鏈表是不是需要轉(zhuǎn)換成紅黑樹(shù)了

紅黑樹(shù)



6、最后是元素統(tǒng)計(jì)

addCount




最后附上一張完整的注釋截圖。

截圖真的不好截 +_+!


總結(jié):

ConcurrentHashMap的線程安全是如何保證的?

看到這里其實(shí)能夠大概看到端倪,Doug lea大量使用了Unsafe的Cas的原子操作,并且使用了synchronized上鎖,及volatile的同步來(lái)保證安全的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容