CAS 介绍
CAS 操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 ,否则处理器不做任何操作。
Java 并发包
JUC 并发包中原子类,都存放在 java.util.concurrent.atomic 类路径下。
Unsafe 类
Unsafe 是位于 sun.misc 包下的一个类,Unsafe 提供了CAS 方法,直接通过 native 方式调用了底层的 CPU 指令。
CAS 缺点
1、ABA 问题。JDK 提供了两个类 AtomicStampedReference、AtomicMarkableReference 来解决 ABA 问题。
2、只能保证一个共享变量的原子操作。规避方法为:使用 AtomicReference 把多个共享变量合并成一个共享变量来操作。
3、循环时间长开销大。高并发下 N 多线程同时去操作一个变量,会造成大量线程 CAS 失败。