JMM的“主内存”和“工作内存”是抽象规则而非物理划分;主内存为线程共享的数据源(对应堆/方法区中的实例字段、静态变量等),工作内存为线程私有副本空间,变量读写必须经read/load→use/assign→store/write八种原子操作严格交互。

Java 内存模型(JMM)里的“主内存”和“工作内存”不是物理内存划分,而是一套为保障多线程正确性设计的抽象规则。理解它们的关键,不在于找对应哪块真实内存,而在于看清变量值如何在共享与私有之间安全流动。
主内存是所有线程可见的共享数据源
主内存逻辑上对应 JVM 堆和方法区中存储的内容,比如实例字段、静态变量、数组元素。它不归某个线程所有,而是所有线程都能读写的“公共记事本”。但注意:线程不能直接在这本子上涂改——任何修改都必须经过自己的“草稿本”完成后再抄回去。
工作内存是线程私有的操作空间
每个线程都有自己的工作内存,它不等于虚拟机栈或 CPU 缓存本身,而是对线程操作变量时所用副本的统一抽象。可能体现为寄存器、L1/L2 缓存、写缓冲区,甚至编译器优化生成的临时存储。线程读写变量,本质上是在操作这个副本,而不是主内存中的原始值。
变量交互靠八种原子操作严格串联
从主内存到工作内存、再从工作内存回写主内存,整个过程被拆解为 8 个不可分割的操作,且必须成对、按序发生:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- read + load:先从主内存读取变量值,再载入工作内存副本(二者必须连续,中间不能插入其他操作)
- use + assign:把工作内存值传给执行引擎参与计算;引擎结果再赋给工作内存变量
- store + write:把工作内存变量值传出,再写入主内存对应位置(同样必须连续)
- lock + unlock:用于同步块/方法,保证临界区变量独占访问
线程间通信必须绕道主内存
线程 A 修改了变量,线程 B 要看到这个变化,不是因为 A 把值“推”给了 B,而是因为:
- A 把更新后的值通过 store/write 写回主内存
- B 在后续某个时刻,通过 read/load 重新从主内存加载该变量的新值
如果缺少同步机制(如 volatile、synchronized、final 或 happens-before 关系),B 可能一直读取自己工作内存里的旧副本,造成可见性问题。

















