jmm抽象的“主内存”和“工作内存”是为规范多线程共享变量访问而设计的语义模型,非物理内存划分;主内存存储共享变量权威副本,工作内存是线程私有副本空间,所有操作须经read/load→use/assign→store/write八种原子操作交互。

JMM 抽象出的“工作内存”和“主内存”,不是 JVM 运行时数据区(堆、栈、方法区)的直接映射,而是一套为解决多线程并发访问共享变量而设计的**语义模型**——它不对应某块真实内存,而是描述线程如何读写变量的规则。
工作内存是线程私有的操作副本空间
每个线程都有自己的工作内存,它保存的是**主内存中某些变量的拷贝**,不是完整镜像,也不是物理上的独立内存段。线程对变量的所有读、写、计算操作,都只能发生在工作内存里。比如:
- 执行 i++ 时,线程先从主内存把 i 的值读到工作内存(read + load),再在工作内存中加 1(use + assign),最后写回主内存(store + write);
- 局部变量、方法参数天然只存在于工作内存(因为它们本就在线程私有的栈帧中),不涉及主内存交互;
- 工作内存的内容可能长期不刷新主内存,也可能被编译器或 CPU 重排序优化,导致其他线程看不到最新值。
主内存是所有线程共享的变量存储源头
主内存是 JMM 中的抽象概念,代表所有线程可访问的共享变量的“权威副本”所在位置。它大致对应 JVM 堆中对象的实例字段、方法区中的静态字段、数组元素等——但不包括栈上分配的局部变量。
- 所有线程看到的同一个变量(如 static int count),其“真值”被认为存于主内存;
- 线程间不能直接传递变量,必须通过“写入主内存 → 其他线程从主内存读取”的方式通信;
- 主内存本身不保证可见性或原子性:一个线程写完,另一个线程不一定立刻读到,除非借助 volatile、synchronized 或锁机制触发内存屏障。
二者交互靠八种原子操作定义行为边界
JMM 用 lock、unlock、read、load、use、assign、store、write 这八种不可分割的操作,严格规定了工作内存与主内存之间数据流动的合法路径。例如:
- read → load 是一对:先把变量从主内存读出,再载入到工作内存;
- assign → store → write 是一对:先在工作内存赋新值,再存回主内存;
- 这些操作之间没有强制顺序,允许重排,但 volatile 和 synchronized 会插入内存屏障,禁止特定重排,并确保某些操作的可见性传播。
这个抽象本质上是在模拟硬件缓存一致性问题
现代 CPU 多核+多级缓存(L1/L2/L3)导致不同核心看到的同一内存地址可能不一致。JMM 把“CPU 缓存”抽象为“工作内存”,把“主存”抽象为“主内存”,用一套语言层规则统一屏蔽底层差异。它不解决性能问题,而是明确告诉你:哪些操作能保证可见、哪些能禁止重排、哪些需要同步手段介入。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











