AtomicInteger對象及CAS原理相關(guān)記錄

在Java中,對一個整數(shù)a執(zhí)行“a++”運算,在單線程的情況下是沒有任何問題的,但是對于多線程的情況來說,就有可能產(chǎn)生線程安全問題??紤]到這個問題,Java中存在一個具有原子性的類型AtomicInteger,它的出現(xiàn)能夠很好的解決這個情況。

原始類:

public class TestDemo1 {
 
    public static volatile int num = 0;
 
    public static void add() {
        num++;
    }
}

使用AtomicInteger類:

public class TestDemo2 {

    // AtomicInteger類中已經(jīng)攜帶了Volatile關(guān)鍵字
    public static AtomicInteger num = new AtomicInteger(0);
 
    public static void add() {
        // 下方的方法代表線程安全的自增方法
        num.getAndIncrement();
    }
}

附上AtomicInteger類的內(nèi)部實現(xiàn)

AtomicInteger內(nèi)部實現(xiàn)


Compare and Swap(CAS),解決多線程并行情況下使用鎖造成性能損耗的一種機制,CAS操作包含三個操作數(shù)——內(nèi)存位置(V)、預(yù)期原值(A)和新值(B)。如果內(nèi)存位置的值與預(yù)期原值相匹配,那么處理器會自動將該位置值更新為新值。否則,處理器不做任何操作。無論哪種情況,它都會在CAS指令之前返回該位置的值。CAS有效地說明了“我認為位置V應(yīng)該包含值A(chǔ);如果包含該值,則將B放到這個位置;否則,不要更改該位置,只告訴我這個位置現(xiàn)在的值即可。

其實上述的AtomicInteger類中的getAndIncrement()方法,底層實現(xiàn)如下:

getAndIncrement方法

可以看到其中使用到Unsafe類,它是CAS的核心類,存在于sun.misc包中,Unsafe類中所有的方法都是native的,故其基本都是直接調(diào)用底層資源來執(zhí)行相關(guān)的任務(wù)。而Unsafe類對象的getAndAddInt()方法內(nèi)部實現(xiàn)如下:
getAndAddInt方法

其中參數(shù)var1對應(yīng)上方的this,var2對應(yīng)上方的valueoffset,var4則對應(yīng)上方的增值,通過getIntVolatile方法獲取當前主內(nèi)存中對應(yīng)地址的值(預(yù)期原值),并將其賦值給var5,此時再執(zhí)行while中的compareAndSwapInt方法對預(yù)期原值進行運算并返回,此時會再次獲取一次主內(nèi)存中的值跟預(yù)期原值進行比較,若相同則進行計算并返回,若不同則更新預(yù)期原值。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容