1 为什么还要LongAdder
LongAdder类是JDK1.8新增的一个原子性操作类。高并发的请求下,AtomicLong的cas自旋算法,竞争激烈,导致性能下降。这个类有价值的代码也就几十行。
public class LongAdder extends Striped64 implements Serializable {
public LongAdder() {
}
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)))
longAccumulate(x, null, uncontended);
}
}
public void increment() {
add(1L);
}
public void decrement() {
add(-1L);
}
public long sum() {
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;
}
这里出现了一个类Cell,这个类是Striped64类的静态内部类,因此当Striped64对象初始化时并不会连带将Cell类初始化,其源码如下