欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JAVA 多线程 LongAdder和AtomicLong

程序员文章站 2022-04-15 17:46:33
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的自旋会成为瓶颈。
JAVA 多线程 LongAdder和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 多线程 LongAdder和AtomicLong
具体实现原理看
https://www.cnblogs.com/wang-meng/p/12892695.html 

相关标签: JAVA 多线程