AtomicBoolean 源码分析
成员变量
value
private volatile int value;
volatile 修饰,因为value 多线程会改变数值,这里用int 类型1,0表示boolean 的 true 和false
unsafe
private static final Unsafe unsafe = Unsafe.getUnsafe();
使用Unsafe的方法来修改value 数值
valueOffset
private static final long valueOffset;
用来保存value 在类中的位置AtomicBoolean,在static 中初始化
valueOffset = unsafe.objectFieldOffset
(AtomicBoolean.class.getDeclaredField("value"));
重要方法
compareAndSet
value 等于expect 值就设置update,核心代码
return unsafe.compareAndSwapInt(this, valueOffset, e, u);
getAndSet
获取数值并设置为newvalue
boolean prev;
do {
prev = get();
} while (!compareAndSet(prev, newValue));
return prev;
这里使用乐观锁的方式,设置newalue,先获取旧值,使用compareAndSet设置新值,如果在这之间有更新就循环重做。
学习要点
使用unsafe类
使用unsafe类
objectFieldOffset
unsafe.objectFieldOffset
方法用于获取某个字段相对Java对象的“起始地址”的偏移量。
compareAndSwapInt
unsafe.compareAndSwapInt(this, valueOffset, e, u);
cas方式根据相对字段位置修改java的字段的数据
乐观锁的方式更新
do {
prev = get();
} while (!compareAndSet(prev, newValue));