調用unsafe.objectFieldOffset獲取value字段在對象中的偏移量(其實就是一個字段到對象頭部的偏移量,經過這個偏移量能夠快速定位字段)多線程
static { try { valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value")); } catch (Exception ex) { throw new Error(ex); } }
定義value爲volatile類型,保證value在多線程中的可見性this
private volatile int value;
調用unsafe.getAndAddInt,參數爲當前對象,偏移量,操做值線程
/** * Atomically decrements by one the current value. * * @return the updated value */ public final int decrementAndGet() { //最後-1是因爲getAndAddInt獲取的值爲交換前的值 return unsafe.getAndAddInt(this, valueOffset, -1) - 1; }
getAndAddIntcode
經過compareAndSwapInt返回循環getIntVolatile獲取最新內存值對象
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; }
getIntVolatile內存
方法包含兩個參數,當前對象,偏移量;獲取內存地址指向的整數,並支持volatile語義rem
public native int getIntVolatile(Object var1, long var2);
compareAndSwapIntget
方法包含了四個參數,當前對象,偏移量,指望值,新值;若是當前對象對應偏移量的值與指望值相同,則把當前對象的值更改成新值,並返回true;不然返回falseio
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);