AtomicInteger原子操作类
incrementAndGet方法采用CAS操作,做到了非阻塞同步。
public final int incrementAndGet() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
由此可见,AtomicInteger底层实现采用CAS操作,调用的是Unsafe的compareAndSwapInt方法。
LongAdder
LongAdder内部维护一个base值,还有一个Cells数组,每个Cell里面有一个初始值为0的long型变量,在同等并发量的情况下,争夺单个变量的线程会减少,这是变相的减少了争夺共享资源的并发量,另外多个线程在争夺同一个原子变量时候,如果失败并不是自旋CAS重试,而是尝试获取其他原子变量的锁,最后当获取当前值时候是把所有变量的值累加后再加上base的值返回的。
在longAccumulate()方法中有个条件是n >= NCPU
就不会走到扩容逻辑。