Atomic是原子的意思。很显然,是为了解决多线程的原子性问题。AtomicBoolean 就是其中的一个。
介绍下几个常用的方法。
get
public final boolean get() {
return value != 0;
}
当value为1时 value != 0 true
当value为0时 value != 0 false
set
public final void set(boolean newValue) {
value = newValue ? 1 : 0;
}
很明显,这个是强制置值。
boolean为true value设置为1
boolean为false value设置为0
compareAndSet
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);
}
如果当前值==期待值,将值设置为指定的更新值。
返回值:
如果成功,假表示实际值!=预期值。
getAndSet
public final boolean getAndSet(boolean newValue) {
boolean prev;
do {
prev = get(); // 暂存上一个值
} while (!compareAndSet(prev, newValue)); // 这个while没太看懂,应该是为了确定可以拿到值。
return prev;
}
自动设置为给定值并返回上一个值。
Unsafe
Unsafe是java基础工具rt.jar中的类,AtomicBoolean就用到了Unsafe。
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); }
}
Unsafe.compareAndSwapInt
此方法是Java的native方法,并不由Java语言实现。
方法的作用是,读取传入对象o在内存中偏移量为offset位置的值与期望值expected作比较。
相等就把x值赋值给offset位置的值。方法返回true。
不相等,就取消赋值,方法返回false。
这也是CAS的思想,及比较并交换。用于保证并发时的无锁并发的安全性。
初始值是设置为true好,还是false好
new AtomicBoolean(false);
true和false都是可以的,但是注意判断的时候逻辑要相反。