atomicBoolean源码分析
注意:解析都放在源码里面
源码
package java.util.concurrent.atomic;
import sun.misc.Unsafe;
/**
一个boolean值可以用原子更新。 有关原子变量属性的描述,请参阅java.util.concurrent.atomic包规范。 一个AtomicBoolean用于诸如原子更新标志的应用程序,不能用作替代Boolean 。
从以下版本开始:
1.5
另请参见:
Serialized Form
*
* @since 1.5
* @author Doug Lea
*/
public class AtomicBoolean implements java.io.Serializable {
private static final long serialVersionUID = 4654671469794556979L;
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;
/**构造方法
* 用给定的初始值创建一个新的 AtomicBoolean 。
*
*参数 initialValue - 初始值
*/
public AtomicBoolean(boolean initialValue) {
value = initialValue ? 1 : 0;
}
/**构造方法
* 创建一个新的 AtomicBoolean ,初始值为 false 。
*/
public AtomicBoolean() {
}
/**
* 返回当前值
*
* @return 当前值
*/
public final boolean get() {
return value != 0;
}
/**
* 如果当前值为 ==的预期值,则将该值原子设置为给定的更新值。
*
* @param expect expect - 预期值
* @param update update - 新的价值
* @return true如果成功
*/
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);
}
/**
* 如果当前值为==为预期值,则将该值原子设置为给定的更新值。 可能会失败,所以只是很少适合替代compareAndSet 。
*/
public boolean weakCompareAndSet(boolean expect, boolean update) {
int e = expect ? 1 : 0;
int u = update ? 1 : 0;
return unsafe.compareAndSwapInt(this, valueOffset, e, u);
}
/**
* 无条件地设置为给定的值。
*
* @param newValue newValue - 新的价值
*/
public final void set(boolean newValue) {
value = newValue ? 1 : 0;
}
/**
* 最终设定为给定值。
*
* @param newValue newValue - 新的价值
* @since 1.6
*/
public final void lazySet(boolean newValue) {
int v = newValue ? 1 : 0;
unsafe.putOrderedInt(this, valueOffset, v);
}
/**
* 将原子设置为给定值并返回上一个值。
*
* @param newValue newValue - 新值
* @return 以前的值
*/
public final boolean getAndSet(boolean newValue) {
boolean prev;
do {
prev = get();
} while (!compareAndSet(prev, newValue));
return prev;
}
/**
* 返回当前值的String表示形式。
* 重写: toString在类别 Object
* @return the String representation of the current value
*/
public String toString() {
return Boolean.toString(get());
}
}
参考文献
https://github.com/giantray/stackoverflow-java-top-qa/blob/master/contents/what-is-a-serialversionuid-and-why-should-i-use-it.md