Java内存模型(JMM)不直接保障一致性,而是通过volatile、CAS和内存屏障等机制,由开发者在并发容器源码中构建同步逻辑来实现:volatile确保可见性与禁止重排序,CAS提供无锁原子性并隐含写屏障,lazySet以弱写平衡性能与安全,happens-before链则串联操作形成全局一致视图。

Java 内存模型(JMM)本身不直接“保障”一致性,而是为并发容器的底层实现提供了一套必须遵守的语义契约。真正保障高并发下数据一致性的,是开发者在源码中严格依据 JMM 规则,结合 volatile、CAS、内存屏障等机制所构建的同步逻辑。
volatile 字段确保可见性与禁止重排序
以 ConcurrentLinkedQueue 的节点类为例:
-
volatile E item和volatile Node<E> next声明,让每次读写都作用于主内存,避免线程间看到陈旧副本 - 构造函数中用
UNSAFE.putObject(this, itemOffset, item)替代直接赋值,配合 volatile 语义,确保对象发布时字段初始化对其他线程可见 - 所有 CAS 操作(如
casItem、casNext)都依赖 volatile 字段的内存语义——CAS 成功不仅改变值,还隐含一个“写屏障”,强制刷新缓存
CAS 操作提供无锁原子性
JMM 定义了 CAS 的原子性语义:一次比较并交换操作不可分割。并发容器大量使用它替代锁:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
ConcurrentLinkedQueue入队/出队全程靠casNext和casItem推进指针,失败即重试,不阻塞线程 - CAS 底层映射为 CPU 的
cmpxchg指令,在 x86 上自带 full memory barrier,天然满足 JMM 对原子性和有序性的要求 - 没有锁膨胀开销,多个线程可并行尝试不同节点,吞吐量随核数线性增长
内存屏障与 lazySet 实现性能-安全平衡
并非所有写都需要强同步。JMM 允许通过内存屏障精细控制可见范围:
立即学习“Java免费学习笔记(深入)”;
-
lazySetNext(Node<E> val)使用UNSAFE.putOrderedObject,插入一个 store-store 屏障,保证前面的写不会被重排到它之后,但不强制立即刷回主内存 - 这用于设置已删除节点的 next 指针等“仅需单向传播”的场景,避免不必要的缓存同步开销
- 这种“弱写”仍符合 JMM 的 happens-before 规则链——只要后续有 volatile 读或 CAS,就能建立可见性传递
happens-before 链构建全局一致性视图
单个操作的安全不等于整体一致。并发容器通过操作编排形成可靠的 happens-before 链:
- 入队时,新节点的
item赋值 →casNext成功,构成一个写-读 hb 关系 - 出队时,读取
item(volatile 读)→ 判断是否为 null →casItem清空,构成完整同步路径 - 迭代器虽为弱一致性,但其构造时刻对 head 的 volatile 读,就建立了该时刻前所有完成入队操作的可见性边界

















