本文共 895 字,大约阅读时间需要 2 分钟。
public class LongAdder extends Striped64 implements Serializable { private static final long serialVersionUID = 7249069246863182397L; public LongAdder() { } public void add(long x) { Cell[] as; long b, v; int m; Cell a; // ... }
@sun.misc.Contended static final class Cell { volatile long value; Cell(long x) { value = x; } final boolean cas(long cmp, long val) { return UNSAFE.compareAndSwapLong(this, valueOffset, cmp, val); } // ...}
ConcurrentHashMap中用Contended注解自动对CounterCell来进行填充:每个CounterCell记录了对应Node的键值对数目。这样每次计算size时累加各个CounterCell就可以了
ConcurrentHashMap中CounterCell以数组形式保存,而数组在内存中是连续存储的,CounterCell中只有一个long类型的value属性,这样CPU会缓存CounterCell临近的CounterCell,于是就形成了伪共享。
@sun.misc.Contended
注解来自动填充。转载地址:http://zwgxi.baihongyu.com/