AtomicBoolean類實現

背景知識:

介紹:
AtomicBoolean 是atomic包下第一個類,是一個原子級的boolean的實現。

實現:
AtomicBoolean 是通過CAS 機制實現的支持併發。類中有三個重要屬性

 

    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset;

    static {
        try {
            valueOffset = unsafe.objectFieldOffset
                (AtomicBoolean.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }

    private volatile int value;

Unsafe類提供cas的實現,valueOffset 配合 unsafe 類對指定地址的內存數據進行修改,即修改value。
有參構造函數以及獲取boolean值實現如下

 

 public AtomicBoolean(boolean initialValue) {
        value = initialValue ? 1 : 0;
    }

public final boolean get() {
        return value != 0;
    }

即通過value的1,0來表示false和true,默認的便爲true

cas實現

 

 public final boolean getAndSet(boolean newValue) {
        boolean prev;
        do {
            prev = get();    //獲取當前的狀態true 或false 
        } while (!compareAndSet(prev, newValue)); //判斷是否修改成功,成功則退出,否則一直循環到成功爲止
        return prev;
    }

   public final boolean compareAndSet(boolean expect, boolean update) {
        int e = expect ? 1 : 0;
        int u = update ? 1 : 0;
        return unsafe.compareAndSwapInt(this, valueOffset, e, u); // 如果 e 爲 地址valueOffset 中的值的時候,修改地址offset中的值爲 u,返回true,否則返回false
    }



作者:plan454
鏈接:https://www.jianshu.com/p/c3c0304f9b02
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章