AtomicBoolean源码解析

一、前言

    AtomicBoolean是java.util.concurrent.atomic包下的一个原子并发类,作用是用原子方式更新的 boolean 值。换一句话说,Atomic就是原子性的意思,即能够保证在高并发的情况下只有一个线程能够访问这个属性值(类似我们之前所说的volatile)。

二、源码解析

继承了哪些类

在这里插入图片描述
    由上图可知AtomicBoolean只继承了一个Serializable接口,其他什么也没有。

变量说明

 //序列化序号,用来对对象进行反序列化时的判断
 private static final long serialVersionUID = 4654671469794556979L;
 //unsafe常量,设置为使用Unsafe.compareAndSwapInt进行更新
 private static final Unsafe unsafe = Unsafe.getUnsafe();
 //AtomicBoolean的值在内存地址的偏移量,用它进行CAS操作
 private static final long valueOffset;
 //AtomicBoolean当前的值
 private volatile int value;

valueOffset是如何获取的?

static {
    try {
        //获取valueOffset的偏移量
        valueOffset = unsafe.objectFieldOffset
            (AtomicBoolean.class.getDeclaredField("value"));
    } catch (Exception ex) { throw new Error(ex); }
}

    由源码得知是利用Unsafe类的内部方法进行对“value”获取其内存的偏移地址的。

构造方法

    AtomicBoolean类的构造方法只有两个,如下所示:

//使用给定的初始值创建一个新的AtomicBoolean,即设置当前AtomicBoolean的值
public AtomicBoolean(boolean initialValue) {
    value = initialValue ? 1 : 0;
}
//第二个构造方法是默认的构造方法
public AtomicBoolean() {
}

其他方法

① get()方法,比较简单,看代码可以直接看懂。

//根据构造方法设置的value或者默认value的值返回true/false
public final boolean get() {
    return value != 0;
}

② compareAndSet(boolean expect, boolean update)方法,也就是CAS方法,源码如下所示:

//利用unsafe的CAS进行判断与交换
public final boolean compareAndSet(boolean expect, boolean update) {
    //获取预期值
    int e = expect ? 1 : 0;
    //获取新值,也就是更新后的值
    int u = update ? 1 : 0;
    //通过unsafe的CAS方法进行更新
    return unsafe.compareAndSwapInt(this, valueOffset, e, u);
}

③ set(boolean newValue)方法。

public final void set(boolean newValue) {
    value = newValue ? 1 : 0;
}

④ lazySet(boolean newValue)方法。

//根据newValue设置新的值
public final void lazySet(boolean newValue) {
    //获取新值
    int v = newValue ? 1 : 0;
    //利用unsafe来对新值进行更新
    unsafe.putOrderedInt(this, valueOffset, v);
}

⑤ getAndSet(boolean newValue)方法。

//先获取值在设置新值
public final boolean getAndSet(boolean newValue) {
    boolean prev;
    do {
        //获取旧值
        prev = get();
    } while (!compareAndSet(prev, newValue));
    return prev;
}

三、总结

  1. AtomicBoolean中的内部方法的实现都是利用他的Unsafe变量来进行操作的。
  2. 大部分的方法都是final的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值