JAVA 多线程 LongAdder和AtomicLong
程序员文章站
2022-07-10 18:51:30
AtomicLong : CAS+自旋操作更新AtomicLong中的value值,进而保证value值的原子性更新。 public final long getAndUpdate(LongUnaryOperator updateFunction) { long prev, next; do { prev = get(); next = updateFunction.applyAsLong(prev);...
AtomicLong : CAS+自旋操作更新AtomicLong中的value值,进而保证value值的原子性更新。
public final long getAndUpdate(LongUnaryOperator updateFunction) { long prev, next; do { prev = get(); next = updateFunction.applyAsLong(prev); } while (!compareAndSet(prev, next)); return prev; }
我们在使用CAS + 自旋的过程中,在高并发环境下,N个线程同时进行自旋操作,会出现大量失败并不断自旋的情况,此时AtomicLong的自旋会成为瓶颈。
解决这个问题 需要用到 Doug Lea写的LongAdder
LongAdder:采用"分段"的方式降低CAS失败的频次
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); } }
下一篇: JAVA开发基础(使用IO对象操作流)