Atomic 与 CAS

上一篇:synchronized 与 Lock · 下一篇:线程池

CAS 是什么#

Compare And Swap:比较内存值 V 与预期 A,相等则更新为 B,否则失败重试。底层 CPU 指令保证比较-交换原子性。

// 概念示意,实际用 AtomicInteger
if (V == A) { V = B; return true; } else { return false; }

需配合 volatile 保证读到主内存最新值。

应用:java.util.concurrent.atomic#

用途
AtomicInteger / AtomicLong整型计数
AtomicReference引用 CAS
AtomicIntegerArray数组元素原子更新
LongAdder高并发累加,分段减少竞争
AtomicInteger counter = new AtomicInteger(0);
counter.incrementAndGet(); // CAS 循环直到成功

volatile vs Atomic#

  • volatile:可见性 + 有序性,不保证 i++ 原子性
  • Atomic*:对特定操作提供 CAS 原子性

CAS 的问题#

  1. ABA:值从 A→B→A,CAS 仍成功;可用 AtomicStampedReference 加版本号
  2. 自旋开销:竞争激烈时 CAS 空转耗 CPU
  3. 单变量:多个共享变量需封装或锁

LongAdder#

高并发计数:LongAdder 分段累加,最终 sum();比 AtomicLong 在极高竞争下吞吐更好。

无锁编程#

通过 CAS 循环修改共享数据,失败重试;无阻塞但可能空转。ConcurrentHashMap 部分操作、AQS 底层都依赖 CAS。

一句话总结#

i++ 用 Atomic 或锁;理解 CAS 是并发容器与 AQS 的基础;高并发计数考虑 LongAdder。

文章目录

文章目录