一、前言
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;
}
三、总结
- AtomicBoolean中的内部方法的实现都是利用他的Unsafe变量来进行操作的。
- 大部分的方法都是final的。