天天看點

Java多線程深入學習-atomic原子類實作-AtomicBoolean源碼分析

/**
 * AtomicBoolean
 */
public class AtomicBoolean implements java.io.Serializable {
    private static final long serialVersionUID = 4654671469794556979L;
   
    /**
     * 引入Unsafe類  并擷取對象中value記憶體位址的偏移量
     */
    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); }
    }

    /** 用一個int的 value代表boolean的結果   1-true  0-false*/
    private volatile int value;

    /** 初始化  傳參 */
    public AtomicBoolean(boolean initialValue) {
        value = initialValue ? 1 : 0;
    }

    /** 無參構造  預設值為0-false */
    public AtomicBoolean() {
    }
    /** 擷取值 */
    public final boolean get() {
        return value != 0;
    }
    /** 比較并指派 */
    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);	//值相同并且操作成功傳回true  其他情況傳回false
    }
    public boolean weakCompareAndSet(boolean expect, boolean update) {
        int e = expect ? 1 : 0;
        int u = update ? 1 : 0;
        return unsafe.compareAndSwapInt(this, valueOffset, e, u);
    }

    /** 指派 */
    public final void set(boolean newValue) {
        value = newValue ? 1 : 0;
    }
    public final void lazySet(boolean newValue) {
        int v = newValue ? 1 : 0;
        unsafe.putOrderedInt(this, valueOffset, v);	//直接将目前對象 記憶體位址偏移量為valueOffset的記憶體值設定為v
    }

    /** 修改值為newValue并傳回修改前的值 */
    public final boolean getAndSet(boolean newValue) {
        boolean prev;
        do {
            prev = get();
        } while (!compareAndSet(prev, newValue));	//自選操作 修改失敗則重新操作
        return prev;
    }

    public String toString() {
        return Boolean.toString(get());
    }

}