上一篇:synchronized 与 Lock · 下一篇:线程池
CAS 是什么
Compare And Swap:比较内存值 V 与预期 A,相等则更新为 B,否则失败重试。底层 CPU 指令保证比较-交换原子性。
// 概念示意,实际用 AtomicIntegerif (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 的问题
- ABA:值从 A→B→A,CAS 仍成功;可用
AtomicStampedReference加版本号 - 自旋开销:竞争激烈时 CAS 空转耗 CPU
- 单变量:多个共享变量需封装或锁
LongAdder
高并发计数:LongAdder 分段累加,最终 sum();比 AtomicLong 在极高竞争下吞吐更好。
无锁编程
通过 CAS 循环修改共享数据,失败重试;无阻塞但可能空转。ConcurrentHashMap 部分操作、AQS 底层都依赖 CAS。
一句话总结
i++ 用 Atomic 或锁;理解 CAS 是并发容器与 AQS 的基础;高并发计数考虑 LongAdder。