Java多线程基础 07.Compare-And-Swap
Compare-And-Swap
Compare-And-Swap(之后简称CAS)是支持并发的第一个处理器提供的原子操作。,CAS操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在CAS指令之前返回该位置的值。
CAS的特性使得其成为了解决多线程并行情况下使用锁造成性能损耗的一种方案。
在 Intel 处理器中,比较并交换通过指令的 cmpxchg 系列实现。
Java中的CAS
在JDK1.5之后,Java程序中才可以使用CAS操作,该操作由sun.misc.Unsafe类里面的compareAndSwapInt()和compareAndSwapLong()等几个方法包装提供,虚拟机在内部对这些方法做了特殊处理,即时编译出来的结果就是一条平台相关的处理器CAS指令,没有方法调用的过程,或者可以认为是无条件内联进去了。
public final native boolean compareAndSwapObject(Object object, long valueOffset, Object expect, Object update);
public final native boolean compareAndSwapInt(Object object, long valueOffset, int expect, int update);
public final native boolean compareAndSwapLong(Object object, long valueOffset, long expect, long update);
由于sun.misc.Unsafe类不是提供给用户提供调用的类(Unsafe.getUnsafe()的代码中限制了只有启动类加载器(Bootstrap ClassLoader)加载的Class才能访问它),因此,如果不采用反射手段,我们只能通过其他的Java API来间接使用它,如J.U.C包里面的AtomicInteger类,其中的 compareAndSet()和 getAndIncrement()等方法都使用了 Unsafe 类的 CAS 操作。
ABA问题
核心思路: 加版本号 AtomicStampedReference