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());
    }

}

猜你喜欢

转载自blog.csdn.net/luo_mu_hpu/article/details/106687421