CAS是并发容器的底层骨架而非辅助手段,驱动ConcurrentHashMap(Java 8起CAS+synchronized协作)、ConcurrentLinkedQueue(纯CAS无锁)、LongAdder(分治降竞争)等实现高吞吐、细粒度并发。

CAS 在并发容器中不是“辅助手段”,而是底层骨架。它让 ConcurrentHashMap、ConcurrentLinkedQueue 等容器摆脱全局锁,实现细粒度、高吞吐的并发访问。
ConcurrentHashMap 的 CAS 驱动演进
Java 7 使用分段锁(Segment),本质仍是锁;Java 8 彻底转向 CAS + synchronized 协作模式:
- 数组初始化通过 CAS 设置 volatile table 引用,确保只有一个线程能完成初始化
- 插入新节点时,先用 CAS 尝试更新链表头(Node 数组槽位),成功即结束;失败说明已有线程抢先写入,就转为对链表头加 synchronized 锁再处理
- 红黑树转换、扩容迁移等关键步骤中,多个线程通过 CAS 竞争设置扩容戳(sizeCtl)、移动指针(transferIndex)等控制变量,协调分工而不阻塞
ConcurrentLinkedQueue 的纯 CAS 实现
这是一个完全无锁(lock-free)队列,所有操作仅靠 CAS 和 volatile 完成:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 入队(offer):遍历到队尾,用 CAS 原子地将新节点设为 tail 的 next;若失败(被其他线程抢先),就重新定位 tail,继续尝试
- 出队(poll):用 CAS 尝试将 head.next 设为新的 head;同时借助“懒删除”和两次 CAS(先标记节点,再更新 head)规避 ABA 与内存可见性问题
- 全程没有 synchronized 或 Lock,靠循环 + CAS + 内存屏障(volatile 读写)保障正确性
LongAdder 与 Striped64:CAS 的分治优化
普通 AtomicInteger 在高竞争下会因大量 CAS 失败导致“自旋风暴”。LongAdder 用 CAS 拆解压力:
立即学习“Java免费学习笔记(深入)”;
- 维护一个 base 值(低竞争时直接 CAS 更新)和一个 cells 数组(每个 cell 是一个 AtomicLong)
- 线程哈希到特定 cell 后,优先对该 cell 执行 CAS increment;冲突时才扩容 cells 或退回到 base
- 最终 sum() 是 base 加上所有非空 cell 的值——用空间换时间,大幅降低单点 CAS 竞争
其他容器中的 CAS 角色
CAS 还支撑着更轻量级的并发协作:
- CopyOnWriteArrayList:add 时先复制数组,再用 CAS 原子替换 volatile array 引用,读操作零同步开销
- DelayedWorkQueue(ScheduledThreadPoolExecutor 内部):堆调整中用 CAS 更新数组元素索引,配合 volatile 保证结构变更可见
- Phaser、StampedLock 等同步器:内部状态字段(如 phase、state)均靠 CAS 修改,实现无锁状态跃迁

















