Java 内存模型(Java Memory Model,简称 JMM)是 Java 语言规范中定义的一套抽象规则,用来描述:在多线程环境下,一个线程对共享变量的修改,何时、以何种方式对其他线程可见,以及编译器和处理器可以对指令做哪些重排序。
它不是 JVM 的内存结构(堆、栈、方法区),而是一个并发语义模型。
在单线程中,程序看起来是按代码顺序执行的。但在多线程 + 编译优化 + CPU 优化下,会出现:
例如:
// 线程A
flag = true;
value = 42;
// 线程B
if (flag) {
System.out.println(value);
}
如果没有 JMM,线程 B 可能看到 flag=true 但 value=0。
JMM 就是为了解决这类问题。
JMM 把内存抽象为两部分:
线程A工作内存 <--> 主内存 <--> 线程B工作内存
⚠️ 注意:
一个线程改了变量,其他线程能不能立刻看到?
✅ 用 volatile、synchronized、final 保证
volatile boolean flag = false;
代码是否按写的顺序执行?
❌ 编译器和 CPU 可能重排序
✅ JMM 通过 happens-before 规则约束
操作是否不可中断?
i++ 不是原子的synchronized、Lock、Atomic* 保证JMM 不要求“禁止重排序”,而是规定:
如果 A happens-before B,那么 A 的结果对 B 可见,且 A 看起来先于 B 执行
程序顺序规则
volatile 规则
锁规则
unlock happens-before 后续 lock线程启动规则
Thread.start() happens-before 线程中的任何操作线程终止规则
Thread.join() 返回传递性
volatile int x = 0;
JMM 保证:
x:立即刷主内存x:从主内存读但 ❌ 不保证原子性
| 概念 | 说明 |
|---|---|
| JMM | 并发语义规则 |
| JVM 内存结构 | 堆、栈、方法区 |
| JMM 是规范 | JVM 是实现 |
Java 内存模型是 Java 对“多线程如何安全地共享内存”的抽象规范,它通过主内存 / 工作内存和 happens-before 规则,保证可见性、有序性和合理的原子性。
如果你愿意,我可以:
你想从哪一层继续?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。