AtomicInteger的decrementAndGet方法簡單分析

unsafe.objectFieldOffset

調用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;

decrementAndGet

調用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);
相關文章
相關標籤/搜索