/**
* AtomicBoolean
*/
public class AtomicBoolean implements java.io.Serializable {
private static final long serialVersionUID = 4654671469794556979L;
/**
* 引入Unsafe類 并擷取對象中value記憶體位址的偏移量
*/
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); }
}
/** 用一個int的 value代表boolean的結果 1-true 0-false*/
private volatile int value;
/** 初始化 傳參 */
public AtomicBoolean(boolean initialValue) {
value = initialValue ? 1 : 0;
}
/** 無參構造 預設值為0-false */
public AtomicBoolean() {
}
/** 擷取值 */
public final boolean get() {
return value != 0;
}
/** 比較并指派 */
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); //值相同并且操作成功傳回true 其他情況傳回false
}
public boolean weakCompareAndSet(boolean expect, boolean update) {
int e = expect ? 1 : 0;
int u = update ? 1 : 0;
return unsafe.compareAndSwapInt(this, valueOffset, e, u);
}
/** 指派 */
public final void set(boolean newValue) {
value = newValue ? 1 : 0;
}
public final void lazySet(boolean newValue) {
int v = newValue ? 1 : 0;
unsafe.putOrderedInt(this, valueOffset, v); //直接将目前對象 記憶體位址偏移量為valueOffset的記憶體值設定為v
}
/** 修改值為newValue并傳回修改前的值 */
public final boolean getAndSet(boolean newValue) {
boolean prev;
do {
prev = get();
} while (!compareAndSet(prev, newValue)); //自選操作 修改失敗則重新操作
return prev;
}
public String toString() {
return Boolean.toString(get());
}
}