AtomicInteger
getAndSet方法 修改值并返回旧值
public final int getAndSet(int newValue) { return unsafe.getAndSetInt(this, valueOffset, newValue); //调用unsafe的方法 }
public final int getAndSetInt(Object var1, long var2, int var4) { int var5; do { var5 = this.getIntVolatile(var1, var2); //通过对象及value的偏移地址来获得value的值 } while(!this.compareAndSwapInt(var1, var2, var5, var4)); // var1 对象本身 var2 偏移地址 var 5 旧值 var4 新值 这样就可以原子的修改value的值 return var5; }
在类加载时就会执行静态代码块里的代码,valueOffset就是value在内存中的地址,也就是偏移地址
static { try { valueOffset = unsafe.objectFieldOffset (AtomicInteger.class.getDeclaredField("value")); } catch (Exception ex) { throw new Error(ex); } }
compareAndSet方法
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}