AtomicBoolean类实现

背景知识:

  • sun.misc.Unsafe 类的运用,参见 http://ifeve.com/sun-misc-unsafe/
  • volatile关键字作用,http://www.cnblogs.com/dolphin0520/p/3920373.html

介绍:
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
    }

你可能感兴趣的:(AtomicBoolean类实现)