Atomic原子包下大概可以分成三类,AtomicInteger、AtomicLong、AtomicBoolean这三个是类似的,这里只写一下AtomicLong相关源码。
Atomic包是基于CAS实现的,CAS需要三个值,分别是要更新的值V,期望值E和新值N。当且仅当V和E相等的时候才可以使用新值对V进行替换,当发生冲突时就循环此过程知道成功为止。CAS是基于UNSAFE这个类实现的,这个类拥有直接修改内存,从硬件层面操纵数据,赋值等操作,还可以修改指针,因此是不安全的类。
这个类本身比较简练,因此代码都放在下面了。其中最重要的地方在于原子性的加法或减法比1.7更加简练,在Unsafe类中进行循环比较。
// 获取Unsafe实例,这个实例只有顶级类加载器加载的类才可以使用
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset; //地址偏移量
/**
* Records whether the underlying JVM supports lockless
* compareAndSwap for longs. While the Unsafe.compareAndSwapLong
* method works in either case, some constructions should be
* handled at Java level to avoid locking user-visible locks.
*/
static final boolean VM_SUPPORTS_LONG_CAS = VMSupportsCS8();
/**
* Returns whether underlying JVM supports lockless CompareAndSet
* for longs. Called only once and cached in VM_SUPPORTS_LONG_CAS.
*/
private static native boolean VMSupportsCS8();
//获取value这个值在地址中的偏移值。
static {
try {
valueOffset = unsafe.objectFieldOffset
(AtomicLong.class.getDeclaredField("value"));
} c