原子性、可见性、有序性在MESI协议与JMM协同下统一实现:MESI保障缓存行级可见与状态同步,内存屏障约束重排并触发缓存一致性事务,而复合操作原子性需CPU原子指令(如CAS)配合MESI独占机制。

Java 并发编程中的原子性、可见性、有序性,不是孤立存在的三个概念,而是在多核 CPU 的硬件基础(尤其是 MESI 协议)和 JVM 内存模型(JMM)共同作用下协同工作的。MESI 不是 Java 专有机制,但它为 JMM 提供了底层支撑——没有缓存一致性协议,JVM 就无法可靠地定义“可见”或“有序”。
可见性如何依赖 MESI 实现
可见性问题本质是:线程 A 修改了共享变量 x,线程 B 为什么可能读不到最新值?根本原因在于每个 CPU 核心有自己的 L1/L2 缓存,x 可能被分别缓存在多个核心的缓存行中。
- MESI 通过状态转换保障“写后其他核能感知”:当核心 A 将 x 所在缓存行从 S(Shared)升级为 M(Modified),它必须先使其他核中该缓存行变为 I(Invalid);之后 A 修改 x,就独占了最新值。
- 当核心 B 下次读 x 时,发现本地缓存行是 I 状态,就会触发总线事务,从核心 A(或主内存)重新拉取数据——这个过程就是可见性的硬件基础。
- volatile 变量的写操作,会触发 Store 指令后的 full memory barrier,并配合 lock 前缀指令,强制让当前缓存行进入 M 状态并广播失效请求,正是借用了 MESI 的这套机制。
有序性如何靠内存屏障与 MESI 配合约束
有序性问题分两层:编译器/JVM 的指令重排序(如初始化对象时字段赋值与构造完成标志重排),以及 CPU 层面的乱序执行(如写缓冲区 Store Buffer 延迟刷新)。MESI 本身不解决重排,但为内存屏障提供了生效前提。
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- volatile 读/写插入的内存屏障(如 LoadLoad、StoreStore),会阻止特定类型的指令跨越屏障重排;而这些屏障最终要落地为 CPU 指令(如 mfence、lfence),它们会等待 Store Buffer 刷出、等待缓存一致性事务完成。
- 例如 DCL 单例中,volatile 修饰 instance 字段,不仅禁止 new 指令重排(防止引用提前暴露),还确保写入 instance 后,所有之前对对象字段的初始化(已在 Store Buffer 中)都已刷到缓存行,并通过 MESI 通知其他核——否则即使引用可见,字段仍可能是默认值。
原子性为何不能单靠 MESI 保证
MESI 能保证单个缓存行的读写原子性(如对一个 long 型变量的读写,在 64 位对齐且未跨缓存行时,CPU 硬件保证其不可分割),但它不提供复合操作的原子性。
立即学习“Java免费学习笔记(深入)”;
- i++ 是读-改-写三步,即便每次读写都经由 MESI 同步,中间仍可能被其他线程插入修改——MESI 管的是缓存行状态,不是操作逻辑。
- CAS(Compare-And-Swap)之所以能实现原子性,是因为它依赖 CPU 提供的原子指令(如 x86 的 cmpxchg),该指令在执行期间会锁定缓存行(隐式使用 MESI 的独占机制),确保读-比较-写一气呵成,其他核无法同时修改同一缓存行。
- synchronized 的 Monitor 锁,底层也通过 CAS 和队列机制协调,最终落到对某个对象头字段的原子更新,同样需要 MESI 保证该字段在各核缓存中的一致视图。
三者协同的关键落点:缓存行与内存屏障
真正把原子性、可见性、有序性串起来的物理单元是缓存行(Cache Line),而控制其行为的开关是内存屏障。
- 一个 volatile 写:触发 StoreStore 屏障 → 刷 Store Buffer → 将缓存行置为 M 状态 → 广播失效 → 其他核缓存行变 I → 下次读必须重新加载 → 可见性达成。
- 一个 volatile 读:触发 LoadLoad 屏障 → 等待前面所有读完成 → 从缓存(或主存)加载最新值 → 若缓存行是 I,则触发总线读事务 → 从拥有 M/E 状态的核获取 → 有序性与可见性同步满足。
- 伪共享(False Sharing)恰恰说明三者脆弱的协同关系:两个高频修改的变量若落在同一缓存行,即使各自用 volatile 修饰,也会因 MESI 频繁无效化导致性能暴跌——此时原子性、可见性都没问题,但有序性保障的成本剧增,系统整体并发效率崩塌。


















