ConcurrentHashMap的源码分析-CounterCells解释
生活随笔
收集整理的這篇文章主要介紹了
ConcurrentHashMap的源码分析-CounterCells解释
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ConcurrentHashMap是采用CounterCell數組來記錄元素個數的,像一般的集合記錄集合大小,直接定義一個size的成員變量即可,當出現改變的時候只要更新這個變量就行。為什么ConcurrentHashMap要用這種形式來處理呢?
問題還是處在并發上,ConcurrentHashMap是并發集合,如果用一個成員變量來統計元素個數的話,為了保證并發情況下共享變量的的難全興,勢必會需要通過加鎖或者自旋來實現,如果競爭比較激烈的情況下,size的設置上會出現比較大的沖突反而影響了性能,所以在ConcurrentHashMap采用了分片的方法來記錄大小,具體什么意思,我們來分析下?
private transient volatile int cellsBusy;// 標識當前cell數組是否在初始化或擴容中的CAS標志位 /** * Table of counter cells. When non-null, size is a power of 2. */ private transient volatile CounterCell[] counterCells;// counterCells數組,總數值的分值分別存在每個cell中 @sun.misc.Contended static final class CounterCell { volatile long value; CounterCell(long x) { value = x; } } //看到這段代碼就能夠明白了,CounterCell數組的每個元素,都存儲一個元素個數,而實際我們調用size方法就是通過這個循環累加來得到的 //又是一個設計精華,大家可以借鑒; 有了這個前提,再會過去看addCount這個方法,就容易理解一些了 final long sumCount() { CounterCell[] as = counterCells; CounterCell a; long sum = baseCount; if (as != null) { for (int i = 0; i < as.length; ++i) { if ((a = as[i]) != null) sum += a.value; } } return sum; }?
總結
以上是生活随笔為你收集整理的ConcurrentHashMap的源码分析-CounterCells解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ConcurrentHashMap的源码
- 下一篇: ConcurrentHashMap的源码