Java 并发编程核心:CAS 原理

发布时间:2026/7/7 11:30:06

Java 并发编程核心:CAS 原理 在 Java 高并发编程中CASCompare And Swap比较并交换是无锁编程的基石也是 JUC 原子类、AQS、ConcurrentHashMap 等核心组件的底层实现。本文将从原理、流程、代码实践、底层实现到优缺点与面试考点带你彻底吃透 CAS。一、为什么需要 CAS多线程同时修改共享变量如i时会出现线程不安全问题。传统解决方案synchronized属于互斥阻塞锁虽然安全但存在线程切换、唤醒开销属于 “重量级” 同步方案。而 CAS 提供了一种无锁、轻量级的线程安全实现方式无需加锁即可保证并发下变量修改的原子性在高并发场景下性能更优。二、CAS 核心原理与执行流程1. CAS 是什么CAS 是 CPU 原生支持的原子操作核心逻辑先比较内存中的值是否与预期值一致一致则修改为新值不一致则放弃修改重新尝试。2. CAS 的 3 个核心参数V主内存中的真实当前值A线程本地保存的预期旧值B线程计算后要写入的新值3. CAS 完整执行流程线程从主内存读取变量值 V保存为本地预期值 A根据业务计算出要修改的新值 B执行 CPU 原子指令比较判断内存中的 V 是否等于预期值 A交换相等则说明无其他线程修改将 V 替换为 B重试不相等则说明值已被改动重新读取 V循环重试自旋。三、Java 中的 CAS 应用Atomic 原子类Java 在java.util.concurrent.atomic包下提供了一系列原子类底层完全基于 CAS 实现开箱即用线程安全且高效。1. compareAndSet 方法演示AtomicInteger num new AtomicInteger(0); // 预期值 0新值 10V A修改成功 boolean success1 num.compareAndSet(0, 10); // true // 预期值 0新值 20V ! A修改失败 boolean success2 num.compareAndSet(0, 20); // false2. incrementAndGet 自旋演示incrementAndGet()是线程安全的i底层就是CAS 自旋// 底层简化源码 public final int incrementAndGet() { for (;;) { // 自旋失败就无限重试直到成功 int current get(); int next current 1; if (compareAndSet(current, next)) return next; } }四、CAS 为什么是原子的很多同学疑惑比较 交换明明是两步为什么不会被其他线程打断原因只有一句CAS 不是 Java 代码实现而是 CPU 硬件级别的单条原子指令。X86 架构LOCK CMPXCHGARM 架构LDXR / STXR单条指令执行过程不可分割、不可中断要么全部完成要么完全不执行从硬件层面保证了原子性。五、CAS 的三大问题及解决方案面试高频CAS 虽高效但并非完美存在三个典型缺陷也是面试必考点。1. 自旋消耗 CPU高并发下大量线程同时修改一个变量CAS 会频繁失败线程无限循环重试导致 CPU 占用过高。解决方案限制自旋次数或使用分段优化如LongAdder采用分段计数 CAS降低冲突。2. 仅支持单个变量的原子操作CAS 一次只能对一个变量做原子操作无法保证多个变量同时修改的原子性。解决方案将多个变量封装成对象使用AtomicReference保证原子性或使用synchronized。3. ABA 问题最经典、重点问题场景主内存值 V A线程 2 先将 A → B再 B → A线程 1 执行 CAS发现 V A以为没被修改直接修改成功。问题本质CAS 只关心最终值不关心修改过程在转账、库存等业务中会引发逻辑错误。解决方案给变量加版本号每次修改版本号 1CAS 同时比较值 版本号只有两者都一致才修改。Java 提供AtomicStampedReference。六、CAS vs synchronized核心对比特性CASsynchronized实现方式无锁基于 CPU 原子指令互斥锁JVM 层面阻塞线程线程状态不阻塞失败自旋重试抢不到锁则阻塞唤醒开销较大性能表现低并发极快高并发因自旋导致 CPU 占用高低并发一般高并发下稳定但性能较差适用场景读多写少、单个变量、高并发场景写多读少、多变量、复杂业务逻辑简单总结读多写少用 CAS追求无锁高效写多、逻辑复杂用 synchronized保证安全稳定。七、总结CAS 比较并交换无锁、轻量、基于 CPU 原子指令三参数V当前值、A预期值、B新值流程读取 → 计算 → 比较交换 → 失败自旋Java 中使用 Atomic 原子类快速实现 CAS三大问题自旋耗 CPU、单变量、ABA分别有对应解决方案CAS 与 synchronized 没有绝对优劣根据场景选择。吃透 CAS不仅能应对面试高频问题更能理解 JUC 全家桶的底层思想为高并发编程打下坚实基础。

相关新闻