在學習ConcurrentHashMap的高併發時,找到了一些高質量的博客,就沒有重複轉載了。分別列出了JDK6中的Segment分段加鎖機制和JDK8中的CAS無鎖算法併發機制。
基於JDK6
在JDK6中ConcurrentHashMap的的併發實現主要利用內部類Segment實現”分段加鎖“的思想。ConcurrentHashMap 類中包含兩個靜態內部類 HashEntry 和 Segment。HashEntry 用來封裝映射表的鍵 / 值對;Segment 用來充當鎖的角色,每個 Segment 對象守護整個散列映射表的若干個桶。每個桶是由若干個 HashEntry 對象鏈接起來的鏈表。一個 ConcurrentHashMap 實例中包含由若干個 Segment 對象組成的數組。
基於JDK8
JDK8的版本,與JDK6的版本有很大的差異。實現線程安全的思想也已經完全變了,它摒棄了Segment(鎖段)的概念,而是啓用了一種全新的方式實現,利用CAS算法。它沿用了與它同時期的HashMap版本的思想,底層依然由“數組”+鏈表+紅黑樹的方式實現,但是爲了做到併發,又增加了很多輔助的類,例如TreeBin,Traverser等對象內部類。
CAS算法實現無鎖化的修改值的操作,他可以大大降低鎖代理的性能消耗。這個算法的基本思想就是不斷地去比較當前內存中的變量值與你指定的一個變量值是否相等,如果相等,則接受你指定的修改的值,否則拒絕你的操作。因爲當前線程中的值已經不是最新的值,你的修改很可能會覆蓋掉其他線程修改的結果。這一點與樂觀鎖,SVN的思想是比較類似的。