背景知識:
- sun.misc.Unsafe 類的運用,參見 http://ifeve.com/sun-misc-unsafe/
- volatile關(guān)鍵字作用脆荷,http://www.cnblogs.com/dolphin0520/p/3920373.html
介紹:
AtomicBoolean 是atomic包下第一個類望侈,是一個原子級的boolean的實現(xiàn)项贺。
實現(xiàn):
AtomicBoolean 是通過CAS 機制實現(xiàn)的支持并發(fā)。類中有三個重要屬性
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的實現(xiàn)醋界,valueOffset 配合 unsafe 類對指定地址的內(nèi)存數(shù)據(jù)進行修改茂翔,即修改value凳兵。
有參構(gòu)造函數(shù)以及獲取boolean值實現(xiàn)如下
public AtomicBoolean(boolean initialValue) {
value = initialValue ? 1 : 0;
}
public final boolean get() {
return value != 0;
}
即通過value的1,0來表示false和true帖蔓,默認的便為true
cas實現(xiàn)
public final boolean getAndSet(boolean newValue) {
boolean prev;
do {
prev = get(); //獲取當前的狀態(tài)true 或false
} while (!compareAndSet(prev, newValue)); //判斷是否修改成功矮瘟,成功則退出,否則一直循環(huán)到成功為止
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
}