JDK1.8的LongAdder分析

文档地址在这里 LongAdder Api

直接看代码

add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void add(long x) {
Cell[] as; long b, v; int m; Cell a;
// cells非null或者在base上cas递增失败
if ((as = cells) != null || !casBase(b = base, b + x)) {
boolean uncontended = true;
if (as == null || (m = as.length - 1) < 0 ||
// getProbe()是个随机数,与m求与运算,能获得一个最小0最大m的数
(a = as[getProbe() & m]) == null ||
// 利用随机数,去cells上随机取一个Cell做CAS递增
!(uncontended = a.cas(v = a.value, v + x)))
// 如果递增失败,即出现竞争,调longAccumulate方法
longAccumulate(x, null, uncontended);
}
}
Read more