作为JUC包下1.8新增的类,类似于AtomicLong用来实现并发下安全的操作Long值,
先梳理了整体思路,有点像类似于1.7下的ConcurrentHashMap,通过分段锁的方式降低了每段锁的竞争程度。
LongAdder有两个核心字段,base和cells
transient volatile long base;transient volatile Cell[] cells;
base作为long类型,如果没有竞争的情况使用base记录存储的值,一旦出现竞争就使用cells。
sum方法:
返回累计的和
public long sum() {
// 把base和cells数组中的值累加起来,如果cells不为空的话
Cell[] as = cells; Cell a;
long sum = base;
if (as != null) {
for (int i = 0; i < as.length; ++i) {
if ((a = as[i]) != null)
sum += a.value;
}
}
return sum;
}
increment():
累计加1,如果没有竞争就用base+x,有竞争就改用cells
public void add(long x) {
Cell[] as; long b, v; int m; Cell a;
if ((as = cells) != null || !casBase(b = base, b + x)) {
boolean uncontended = true;
if (as == null || (m = as.length - 1) < 0 ||
(a = as[getProbe() & m]) == null ||
!(uncontended = a.cas(v = a.value, v + x)))
longAccumul