背景知識:
- 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
}
作者:plan454
鏈接:https://www.jianshu.com/p/c3c0304f9b02
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。