JDK6與JDK7中的實現 採用了分段鎖的設計node
咱們能夠發現JDK8中的實現也是鎖分離的思想,只是鎖住的是一個Node,而不是JDK7中的Segment,而鎖住Node以前的操做是無鎖的而且也是線程安全的,創建在以前提到的3個原子操做上。算法
8跟6,7比主要設計上的變化有如下幾點: 數組
爲何JDK8中使用synchronized而不是ReentrantLock,是由於:安全
1.JDK8中對synchronized有了足夠的優化,不用過度擔憂性能差別。併發
2.相比ReentrantLock,它能夠減小內存消耗。性能
https://my.oschina.net/hosee/blog/675884優化
1.8中放棄了Segment
臃腫的設計,取而代之的是採用Node
+ CAS
+ Synchronized
來保證併發安全進行實現。對鏈表長度超過必定數量8個後,轉成紅黑樹保存。spa
size方法區別:.net
1.7中先採用不加鎖的方式,連續計算元素的個數,最多計算3次:
一、若是先後兩次計算結果相同,則說明計算出來的元素個數是準確的;
二、若是先後兩次計算結果都不一樣,則給每一個Segment
進行加鎖,再計算一次元素的個數;線程
1.8中使用一個volatile
類型的變量baseCount
記錄元素的個數,部分元素的變化個數保存在CounterCell
數組中,經過累加baseCount
和CounterCell
數組中的數量,便可獲得元素的總個數;
深刻淺出ConcurrentHashMap(1.8)
http://www.jianshu.com/p/c0642afe03e0
談談ConcurrentHashMap1.7和1.8的不一樣實現
http://www.jianshu.com/p/e694f1e868ec
ConcurrentHashMap的紅黑樹實現分析
http://www.jianshu.com/p/23b84ba9a498
深刻分析ConcurrentHashMap1.8的擴容實現
http://www.jianshu.com/p/f6730d5784ad