CAS在多核CPU上的原子性由CPU硬件自动保障,现代x86 CPU(奔腾486后)几乎不启用总线锁,而是基于MESI协议通过缓存行独占(RFO)实现“缓存锁”,仅在跨缓存行、不可缓存内存等极少数场景才回退至总线锁。

CAS 在多核 CPU 上的原子性,并不依赖程序员或 JVM 主动“加总线锁”,而是由 CPU 硬件在执行 cmpxchg 指令时,根据当前缓存状态自动决定是否触发总线级锁定——但现代 x86 CPU(奔腾486 之后)几乎从不真正使用传统总线锁。
总线锁只是历史机制,现代 CPU 已基本弃用
早期单核或弱一致性系统中,CPU 确实通过发出 LOCK# 信号阻塞整条前端总线,使其他处理器暂停内存访问,从而独占共享变量。这种方式开销极大,会拖慢所有非相关内存操作。自 Intel 奔腾486 起,硬件引入 MESI 缓存一致性协议后,总线锁就退化为兜底策略,仅在极少数场景下启用:
- 目标地址跨缓存行边界(例如对未对齐的 64 位值做 CAS)
- 内存区域被标记为不可缓存(如某些设备寄存器映射区)
- 运行在老旧或特殊嵌入式平台(非主流服务器/PC)
CAS 实际靠缓存行级协同实现原子性
当调用 Unsafe.compareAndSwapInt 时,JVM 最终生成带 lock 前缀的 cmpxchg 指令。该指令本身不“申请锁”,而是触发 CPU 微架构的一系列自动行为:
- 若目标变量所在缓存行已在本核处于 Exclusive 或 Modified 状态:直接在本地 L1/L2 缓存完成读-比较-写,无需总线信号
- 若该缓存行在其他核上为 Shared:本核发起 RFO(Request For Ownership),通过片上互连(如 Intel 的 Ring Bus 或 Mesh)通知其他核将对应缓存行置为 Invalid,获得独占权后再操作
- 整个 RFO 过程由硬件协议保障顺序与排他,对软件完全透明,效果等同于“缓存锁”
JVM 和 Java 层面不控制锁类型
Java 开发者看到的 AtomicInteger.incrementAndGet(),其底层调用链是:
立即学习“Java免费学习笔记(深入)”;
Java 方法 → Unsafe.nativeCompareAndSwapInt() → JVM C++ 实现(Atomic::cmpxchg)→ x86 汇编 lock cmpxchg 指令
这个 lock 前缀不是让 CPU “去加总线锁”,而是告诉 CPU:“请以原子方式执行这条读-改-写指令”,具体如何保证,全部交由 CPU 自行按当前缓存状态和一致性协议裁决。JVM 不参与、也无法干预这一硬件决策过程。
为什么资料里常提“总线锁”?
部分教材、博客或面试总结沿用了早期文档的简化说法,把 lock 前缀直接等同于“总线锁定”。这种表述在教学上便于理解,但不符合现代 CPU 实际行为。截至 2026 年,主流服务器 CPU(Intel Xeon / AMD EPYC)在正常应用内存场景下,CAS 几乎 100% 走缓存一致性路径,不会真正阻塞总线。


















