/**
* 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());
}
}
Java多线程深入学习-atomic原子类实现-AtomicBoolean源码分析
猜你喜欢
转载自blog.csdn.net/luo_mu_hpu/article/details/106687421
今日推荐
周排行