從原始碼分析ConcurrentHashMap執行緒安全和高效的特性

RomanticMain發表於2020-12-05

在IDEA裡面通過ctrl+n搜尋ConcurrentHashMap類

這樣就得到了ConcurrentHashMap類的原始碼

再在這個類中通過ctrl+f12查詢類中的方法put

在put方法裡分析原始碼看它為什麼可以實現執行緒安全而又高效

在put方法裡可以看到它呼叫了putVal方法

所以需要再到putVal方法裡去檢視

(最後一句tab = helpTransfer是在給儲存hash碼值的陣列tab擴容)

cas演算法

拿期望值去比較要替換的變數

如果一樣 就把新值替換上去

如果不一樣 就不進行替換

因為當沒有人在動要替換的變數時 期望值和要替換的那個變數將會是一樣的 反之說明有人在動這個變數 如果進行替換則會產生執行緒安全的問題

沒有替換成功 將會進行迴旋 再取替換的變數進行和期望值的比較 直至一樣進行替換

即在別人改完後再進行替換 就不會有執行緒安全的問題

通過這個演算法實現執行緒安全

繼續往下看

它針對對應一個hash碼值的連結串列或者紅黑樹進行上鎖

而不是針對所有hash碼值的所有連結串列或紅黑樹上鎖 即分段上鎖

通過這種方式實現高效而且執行緒安全

相關文章