一、Compare-And-Swap
- 是CPU提供的一种原子指令
- 是无锁并发算法的基础,适合读多写少、竞争不激烈的场景
二、核心思想
- 比较内存中的某个值是否为预期值,如果是,则更新为新值,否则不做修改。
- 这个操作是原子性的。
三、工作原理
- Compare比较:CAS会检查内存中的某个值是否与期望值相等。
- Swap交换:如果相等,则将内存中的值更新为新值。
- 失败重试:如果不相等,说明其他线程已经修改了该值,CAS操作失败,一般会利用重试,直到成功。
四、CAS的优点
- 无锁并发:CAS操作不使用锁,因此不会导致线程阻塞,提高了系统的并发性和性能。
- 原子性:CAS操作是原子的,保证了线程安全。
五、CAS的缺点
- ABA问题:CAS操作中,如果一个变量值从A变成B,又变回A,CAS无法检测到这种变化,可能导致错误。(解决方案:引入版本号或时间戳)
- 自旋开销:CAS通过自旋实现,可能导致CPU资源浪费,尤其在高并发情况下。
- 单变量限制:CAS操作仅适用于单个变量的更新,不适用于涉及多个变量的复杂操作。
六、在Java中的具体实现:Atomic原子类
import java.util.concurrent.atomic.AtomicInteger; public class AtomicDemo1 { // 基本类型原子类 private AtomicInteger atomicInt = new AtomicInteger(0); public void method1(){ // 标准的CAS使用方式 int oldValue, newValue; do { oldValue = atomicInt.get(); newValue = oldValue + 1; System.out.println(Thread.currentThread().getName() + "--oldValue:" + oldValue +";newValue:" + newValue); } while (!atomicInt.compareAndSet(oldValue, newValue)); // 内置方法 // atomicInt.decrementAndGet(); } public static void main(String[] args) throws InterruptedException { AtomicDemo1 atomicDemo1 = new AtomicDemo1(); Thread thread1 = new Thread(() -> { atomicDemo1.method1(); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } }, "线程1"); Thread thread2 = new Thread(() -> { atomicDemo1.method1(); },"线程2"); thread1.start(); thread2.start(); } }