因为在多线程条件下,若是对共享变量修改容易形成数据不一致的状况,因此对于共享变量须要保证线程安全有有以下几种方式:html
lock
或者synchronized
进行同步共享变量该类为后者,基于CAS方式修改具备原子性。java
int
类型表示:1表示true 0表示falseUnsafe.compareAndSwant
方法底层经过CAS原理(CPU中cmpxchg指令)对值进行变化Cloneable
接口,能被克隆Serializable
接口,支持序列化传输private static final long serialVersionUID = 4654671469794556979L; // setup to use Unsafe.compareAndSwapInt for updates //使用unsafe类进行cas private static final Unsafe unsafe = Unsafe.getUnsafe(); //获取该值得偏移量(内存中的地址) private static final long valueOffset; /** * 内部使用int来作boolean的设置 * 默认为0 */ private volatile int value;
serialVersionUID
:序列化IDunsafe
:该类是Atomic中核心类,用于执行低级别,对内存进行操做,内部都是native
方法valueOffset
:字段value的内存偏移地址value
:真实value,1表示true 0表示false,使用volatile
保证内存可见性static { try { //返回对象成员属性在内存地址相对于此对象的内存地址的偏移量 valueOffset = unsafe.objectFieldOffset (AtomicBoolean.class.getDeclaredField("value")); } catch (Exception ex) { throw new Error(ex); } }
主要是经过unsafe方法获取value值得内存偏移地址数组
获取该boolean变量安全
/** * 返回当前值 */ public final boolean get() { return value != 0; }
比较前值后赋值,可能存在赋值失败的状况多线程
/* * 只有当期待的值为expect的时候才会更新相关值 * 1. 期待的值等于如今值,则成功赋值,返回true * 2. 期待的值不等于如今的值,则赋值失败,则返回false */ 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); }
compareAndSwapInt
进行CAS赋值比较前值后进行赋值,用的相对较多this
public final boolean getAndSet(boolean newValue) { boolean prev; do { prev = get(); } while (!compareAndSet(prev, newValue)); return prev; }
compareAndSet
进行CAS赋值无条件设置值,用的相对较少线程
public final void set(boolean newValue) { value = newValue ? 1 : 0; }
也是赋值操做,该操做会让Java插入StoreStore内存屏障,避免发生写操做重排序code
public final void lazySet(boolean newValue) { int v = newValue ? 1 : 0; unsafe.putOrderedInt(this, valueOffset, v); }
boolean
类,是线程安全的