首页  

ConcurrentHashMap size 实现要点     所属分类 java 浏览量 1422
Java7 
先不加锁计算三次,如果三次结果不一样再加锁。


Java8 

baseCount 和 counterCell 进行 CAS 计算,最终通过 baseCount 和 遍历 CounterCell 数组得出 size 。
推荐使用mappingCount 方法,该方法返回 long  
size 方法返回 int  

baseCount 先做 CAS 自增
baseCount CAS 失败 则使用 counterCells
counterCells CAS 失败,在 fullAddCount 方法中,死循环操作,直到成功


@sun.misc.Contended 注解 防止 "伪共享"

伪共享
缓存系统以缓存行(cache line)为单位存储。
缓存行是 2的n次方 个连续字节,一般为32-256个字节。最常见的缓存行大小是64个字节。
当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,会影响彼此的性能 


@sun.misc.Contended static final class CounterCell {
        volatile long value;
        CounterCell(long x) { value = x; }
    }



public int size() {
    long n = sumCount();
    return ((n < 0L) ? 0 :
           (n > (long)Integer.MAX_VALUE) ? Integer.MAX_VALUE : (int)n);
}

public long mappingCount() {
    long n = sumCount();
    return (n < 0L) ? 0L : n; // ignore transient negative values
}

    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;
    }
    


put() 调用 addCount()

上一篇     下一篇
java位运算

HashMap和ConcurrentHashMap中的hash函数

ConcurrentHashMap读不需要加锁的秘密

37种融资模式

企业分析要点

linux打开文件最大数设置