背景知识:
- 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
}
网友评论