JMM不直接提供无锁编程能力,但通过volatile语义、禁止重排序和CAS原子性契约三大特性保障无锁操作的正确性;其性能优势在于零阻塞调度、无锁升级成本及细粒度竞争控制。

Java 内存模型(JMM)本身不直接提供无锁编程能力,但它为无锁编程奠定了关键基础——尤其是通过定义可见性、有序性和原子性的语义边界,使得基于 CAS 的无锁操作能被正确编译、执行和跨线程感知。真正提升并发性能的,是 Java 在 JMM 约束下对底层硬件原子指令(如 CPU 的 CAS)的封装与保障。
JMM 如何支撑无锁编程的正确性
JMM 规定了线程如何读写主内存与工作内存,而无锁算法(如 AtomicInteger.incrementAndGet())依赖三个 JMM 特性才能安全运行:
-
volatile 语义的保证:原子类内部字段均用
volatile修饰,确保每次读取都从主内存加载最新值,每次写入都立即刷新到主内存,避免因缓存不一致导致 CAS 失败或“伪成功” - 禁止重排序的约束:JMM 对 volatile 读写施加内存屏障(Memory Barrier),阻止编译器和处理器将 CAS 前后的指令乱序,保证操作逻辑顺序符合预期
-
CAS 的原子性契约:虽然 JMM 不定义 CAS 指令本身,但它要求 JVM 必须将
Unsafe.compareAndSwapInt等操作映射为硬件级原子指令,并保证其在多线程下“读-比-写”三步不可分割
无锁编程在 JMM 下的实际性能优势
相比 synchronized 或 ReentrantLock,无锁结构在高争用场景中减少资源开销,核心体现在:
- 零阻塞调度:线程不会进入 WAITING 或 BLOCKED 状态,避免操作系统线程挂起/唤醒的上下文切换开销(一次切换约 1–10μs)
- 无锁升级成本:synchronized 在竞争激烈时会膨胀为重量级锁,触发内核态互斥量;而 Atomic 类始终停留在用户态原子指令层面
-
细粒度竞争控制:例如
ConcurrentHashMap(JDK 8+)已放弃分段锁,改用 CAS + synchronized 仅保护单个桶(bin),把锁范围压缩到哈希槽级别,极大降低冲突概率
典型无锁工具与 JMM 协同要点
Java 提供的无锁设施不是“脱离 JMM 运行”,而是严格依托其规则设计:
立即学习“Java免费学习笔记(深入)”;
-
AtomicInteger / AtomicReference:适用于简单状态更新(计数、标志位)。注意:复合操作(如“先读再条件更新”)需手动循环 CAS,且要防范 ABA 问题(可用
AtomicStampedReference) - LongAdder:针对高并发累加场景优化。它放弃单一变量竞争,转而用多个 cell 分散写热点,在 JMM 下通过 volatile cell 数组 + CAS 更新实现最终一致性,吞吐量远超 AtomicLong
-
ConcurrentLinkedQueue:基于无锁链表实现。每个节点的
next字段用 volatile 修饰,保证出队线程能及时看到入队线程的修改,同时用双重检查 + CAS 维护 head/tail 指针的线程安全推进
使用无锁编程必须注意的 JMM 边界
无锁 ≠ 无脑高效。若忽略 JMM 约束,反而引发隐蔽错误:
- 不要在无锁对象中混用非 volatile 普通字段——它们不受 JMM 同步保障,其他线程可能永远看不到修改
- CAS 循环体中避免耗时操作(如 I/O、复杂计算),否则易造成“活锁”,CPU 空转却无法推进
- 无锁数据结构通常只保证局部线程安全,组合使用多个无锁对象时,仍需额外同步机制保障整体逻辑一致性



















