ConcurrentHashMap size 实现要点
所属分类 java
浏览量 1431
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打开文件最大数设置