Skip to content

什么是 Java 内存模型(JMM)? ​

  • 标签:Java并发、Java

🏛 业务架构师 ​

JMM(Java 内存模型)定义了多线程访问共享内存的规则:每个线程有工作内存(缓存抽象),共享变量在主内存;读写何时对其他线程可见、操作如何重排,由 happens-before 规则约束(程序顺序、监视器锁、volatile、线程启动/终止、传递性等)。

抽象,但它的业务价值极其具体——是并发正确性的"合同":

  • 没有合同的世界:CPU 缓存、编译器优化、指令重排各干各的,代码字面顺序和实际执行可以不一致,并发 bug 变成玄学:本地跑不出、压测不出、生产偶发;
  • 有了合同:只要满足 happens-before(比如锁的释放先于获取、volatile 写先于读),线程间可见性就有可推理的保证——JMM 把"硬件的不可预测"隔离掉,让工程师按规则写代码就能正确。

我的三条实践转化:

  1. 按合同选工具:要原子性用锁/CAS,要可见性+有序性用 volatile(状态标志位、配置引用替换),不要靠"感觉"判断线程安全;
  2. 共享可变状态最小化:JMM 复杂度的根源是共享。架构上用不可变对象、ThreadLocal 上下文、消息传递(队列)减少共享面——共享越少,需要合同仲裁的地方越少;
  3. 面试常问的 volatile 不保证原子性就是合同条款:它承诺写立即刷主内存+读强制刷新,但 count++ 的读改写三步仍然可交错——合同保什么、不保什么必须逐条背熟,业务上误用一条就是事故。

一句话:JMM 是 JVM 与开发者之间的契约文档,读懂合同条款,并发问题从"碰运气"变成"可推导"。

🏗 系统架构师 ​

JMM(Java Memory Model)是Java 对多线程读写共享变量的可见性、原子性、有序性的规范,它不是 JVM 内存布局(堆/栈那套),而是并发语义的契约。

抽象结构:每线程有本地内存(工作内存,涵盖缓存/寄存器/写缓冲的抽象),共享变量在主内存。线程操作变量必须先拷贝到工作内存,改完再刷回——这个抽象解释了为什么一个线程的写另一个线程看不到。

核心内容:

  • 8 种原子操作(lock/unlock/read/load/use/assign/store/write)规定主/工作内存交互规则;
  • happens-before 规则:程序顺序、监视器锁(解锁先于后续加锁)、volatile(写先于后续读)、线程 start/join、传递性——这是判断"一个写能否被另一个读看见"的推导工具,程序员只需按规则设计,编译器/CPU 在不违反规则前提下自由优化;
  • 三大特性的映射:volatile 保可见性 + 有序性(内存屏障),锁保三性,CAS 保单个变量原子性。

工程意义:没有 JMM,一切并发正确性都依赖"碰运气";有了它,DCL 单例必须 volatile(防指令重排半初始化)、状态标志位用 volatile、不可变对象安全发布才有法可依。我写并发代码的 checklist 就是"共享状态是什么、谁写谁读、靠哪条 happens-before 保证可见"三问。

💻 全栈开发专家 ​

JMM(Java Memory Model)不是 JVM 内存结构,而是并发编程的语义规范:定义线程和主内存之间的抽象关系——所有共享变量在主内存,每个线程有自己的工作内存(缓存抽象),线程对变量的操作必须在工作内存完成再回写。

它回答一个问题:一个线程的写,什么时候对另一个线程可见。没有 JMM,不同 CPU/编译器的重排会让并发结果不可推理。

核心规则 = happens-before:若 A happens-before B,则 A 的结果对 B 可见且有序。重要规则:

  • 程序次序:单线程内按代码顺序;
  • 监视器锁:解锁 hb 于后续加锁;
  • volatile:写 hb 于后续读;
  • 线程 start() hb 于线程内任何操作;线程一切操作 hb 于 join() 返回;
  • 传递性。

工程对照(我背规范是为了写对代码):

java
// volatile 写-读建立 happens-before,flag 之前的写对读到的线程全部可见
volatile boolean started = false;
int data;                         // 普通字段
// 线程A:data = 42; started = true;
// 线程B:if (started) print(data);  // 保证 42

没有 volatile 时 data 可能读到 0(可见性)——我修过的"配置偶尔没生效"的 bug 就是漏了 volatile。synchronized、volatile、CAS、final 的并发语义全部由 JMM 定义,面试时把话题从"背结构"引到"happens-before 解决什么",深度立刻不一样。