主内存和工作内存是jmm虚构的逻辑概念,主内存为线程共享的数据源,工作内存是线程私有的操作副本;变量交互需经read、load、use、assign、store、write、lock、unlock八个原子操作;volatile、synchronized、final通过不同同步策略保障可见性与有序性。

主内存和工作内存不是 JVM 里的实际内存区域,而是 Java 内存模型(JMM)为规范多线程行为虚构出来的两个逻辑概念。理解它们的关键,不在于“它在哪儿”,而在于“它怎么用”。
主内存是共享数据的统一源头
主内存代表所有线程都能访问的共享存储区域,大致对应 JVM 堆中对象的实例变量、方法区中的静态变量和常量等。它不负责执行,只负责存放最终状态——比如 static int count = 0 就存在这里。多个线程读写同一个变量,本质上都是在跟主内存打交道,它是线程间通信的唯一中转站。
工作内存是线程私有的操作副本空间
每个线程都有自己独立的工作内存,它不是虚拟机栈或堆的一部分,也不等于 CPU 缓存,而是一种行为抽象:线程不能直接操作主内存,必须先把变量值从主内存“拷贝”进来,在自己的工作内存里完成读、算、赋值,再决定是否写回去。这个副本可能暂存在寄存器、L1 缓存,甚至编译器优化后的临时位置,但对程序员来说,只需记住一点:所有变量操作都发生在工作内存中。
变量交互必须走完八步原子操作
JMM 用八个不可分割的动作来约束主内存与工作内存之间的数据流动:
- read:从主内存读取变量原始值
- load:把 read 的结果放进工作内存副本
- use:把工作内存的值传给执行引擎(如参与加法)
- assign:把执行结果赋给工作内存中的变量
- store:把工作内存的最新值发往主内存
- write:把 store 的值真正写入主内存变量
- lock:锁定主内存变量,防止其他线程修改
- unlock:释放锁
其中 read/load 必须连着执行,store/write 也必须连着执行,中间不能插入别的操作——这是保证可见性和有序性的底层机制基础。
同步机制决定了何时强制刷新或重载
普通变量没有强制同步策略,线程可能长期使用工作内存里的旧值;而以下关键字会触发特定的同步行为:
- volatile:每次 use 前强制 read+load(从主内存重新加载),每次 assign 后强制 store+write(立即写回),并插入内存屏障禁止重排序
- synchronized:进入时清空工作内存中相关变量副本(丢弃旧值),退出时将所有修改过的变量 store+write 回主内存
- final:构造器内正确初始化后,其值对其他线程天然可见,无需额外同步
这些机制不是为了“加快速度”,而是为了在允许硬件和编译器优化的前提下,确保多线程程序的行为可预期。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











