ConcurrentHashMap總結

JDK6與JDK7中的實現 採用了分段鎖的設計node

JDK8中的實現 利用CAS算法,在Node上用cas,最小化鎖範圍。

咱們能夠發現JDK8中的實現也是鎖分離的思想,只是鎖住的是一個Node,而不是JDK7中的Segment,而鎖住Node以前的操做是無鎖的而且也是線程安全的,創建在以前提到的3個原子操做上。算法

8跟6,7比主要設計上的變化有如下幾點: 數組

  1. 不採用segment而採用node,鎖住node來實現減少鎖粒度。
  2. 設計了MOVED狀態 當resize的中過程當中 線程2還在put數據,線程2會幫助resize。
  3. 使用3個CAS操做來確保node的一些操做的原子性,這種方式代替了鎖。
  4. sizeCtl的不一樣值來表明不一樣含義,起到了控制的做用。

爲何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數組中,經過累加baseCountCounterCell數組中的數量,便可獲得元素的總個數;

 

  • 深刻淺出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

相關文章
相關標籤/搜索