jmm中的“主内存”和“工作内存”是抽象概念,非物理内存划分;主内存存共享变量(实例/静态字段等),工作内存存其线程私有副本;交互通过read/load、use/assign、store/write、lock/unlock八种原子操作规范完成,同步需volatile、synchronized等关键字触发内存屏障。

Java 内存模型(JMM)里的“主内存”和“工作内存”不是 JVM 运行时数据区(比如堆、栈)的物理划分,而是为描述线程间共享变量如何交互而抽象出来的概念。理解它们的交互规范,关键在于抓住三点:谁存什么、怎么传、何时同步。
主内存与工作内存分别存什么
主内存存储所有线程共享的变量——包括实例字段、静态字段、数组元素。这些是真实可被多线程读写的“源头数据”。
工作内存是每个线程私有的“副本空间”,它不存对象本身,只保存该线程当前用到的那些共享变量的本地副本。局部变量、方法参数不在 JMM 管理范围内,因为它们天然在线程栈帧里,不涉及共享。
8 种交互操作必须成对且有序
JMM 用 8 个原子操作定义变量如何在两者之间流动,它们不能拆分,也必须按规则组合:
- read + load:线程要读一个变量,先从主内存 read 值,再 load 到自己工作内存的副本中;这两步必须连续,不能只做一半
- use + assign:执行引擎使用变量值(use),或把计算结果赋给变量(assign),都只发生在工作内存内
- store + write:线程改完变量后,先 store 到主内存缓冲区,再 write 进主内存对应位置;同样不可分离
- lock + unlock:作用于主内存变量,用于实现排他访问;synchronized 底层就依赖这对操作
同步不是自动发生的,靠关键字触发屏障机制
工作内存的副本不会“自动刷新”或“实时回写”。是否同步、何时同步,取决于代码中是否用了特定关键字:
- 对 volatile 变量读:强制丢弃工作内存旧值,重新从主内存 read/load;写:强制把本次及之前所有写操作(含非 volatile)刷入主内存
- 进入 synchronized 块前,会隐式执行 read/load(确保看到锁释放前的最新值);退出时,强制 store/write 所有已修改变量
- final 字段在构造器结束那一刻,JMM 保证其值对其他线程可见——这是通过禁止重排序 + 写屏障实现的,不是靠反复同步
常见误区提醒
不要把工作内存当成“虚拟机栈”或“本地方法栈”;它更接近 CPU 寄存器+缓存的语义效果。
也不要认为 volatile 能让 counter++ 安全——它只管单次读或写可见,不管“读-改-写”三步的原子性。
更别把 JMM 和堆内存溢出、GC 日志混为一谈,那是 JVM 内存结构的事,和 JMM 不同层。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











