AtomicInteger atomicInteger = new AtomicInteger(5); ... atomicInteger.compareAndSet(5, 2019); // 期望是5的时候,将其赋值为2019
2.Unsafe类:
atomicInteger.getAndIncrement(); // i++
AtomicInteger源码:
1)getAndIncrement()源码:
/** * Atomically increments by one the current value. * * @return the previous value */ public final int getAndIncrement() { return unsafe.getAndAddInt(this, valueOffset, 1); }
valueOffset为变量值在内存中的偏移地址
2)AtomicInteger的value和valueOffset成员
// setup to use Unsafe.compareAndSwapInt for updates private static final Unsafe unsafe = Unsafe.getUnsafe(); private static final long valueOffset; static { try { valueOffset = unsafe.objectFieldOffset (AtomicInteger.class.getDeclaredField("value")); } catch (Exception ex) { throw new Error(ex); } } private volatile int value;
unsafe类源码:
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)); return var5; }
var1为当前AtomicInteger对象,var2是该对象值的引用地址,var4是需要增加的数量
Atomic实现原子性源码分析:CAS(比较并交换)、Unsafe类
原文:https://www.cnblogs.com/MWCloud/p/11460186.html