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

趕腳特別長(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ù)重試


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

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ù)的自平衡等等)

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

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

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

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