JUC: AtomicXXX
使用
AtomicInteger i = new AtomicInteger(10);
i.incrementAndGet(); // 多个线程同时增加,不会造成线程安全问题原理
// AtomicInteger#incrementAndGet
public final int incrementAndGet() {
return unsafe.getAndAddInt(this, valueOffset, 1) + 1; // 给对象this的valueOffset属性+1
}// UnSafe#getAndAddInt
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2); // 获取对象最新的值
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)); // 如果不是期望值(var5仍是当前值,说明没有被其他线程修改),返回false,如果是期望值则设置为 var5+1 目标值
return var5;
}ABA问题
解决ABA问题
LongAdder
最后更新于