发布于2026-07-08 阅读(0)
扫一扫,手机访问
聊到 Ja va 内存模型(JMM),很多人一上来就被“主内存”和“工作内存”这两个概念绕晕了——它俩既不是堆也不是栈,更不是物理内存的某种分区,而是一套用来描述线程间共享变量如何交互的抽象规则。想搞清楚它们之间的交互规范,其实只需要抓住三个核心问题:谁存了什么、数据怎么传、什么时候同步。
主内存里放的是所有线程都能读写的共享变量——包括实例字段、静态字段、数组元素。这些是真正的“源头数据”,线程之间要协作,靠的就是它们。
而工作内存呢?每个线程私有的副本空间,不存对象本身,只保存当前线程用到的那些共享变量的本地副本。至于局部变量、方法参数,它们天生就在线程栈帧里,不涉及共享,所以 JMM 压根不管它们。
JMM 定义了 8 个原子操作来规范变量在主内存和工作内存之间的流动。原子操作意味着不能拆分,而且必须按规则成对出现:
工作内存里的副本不会“自动刷新”也不会“实时回写”。它什么时候同步、怎么同步,全看代码里用了哪些关键字:
别把工作内存理解成“虚拟机栈”或“本地方法栈”的某种变体,它本质上更接近 CPU 寄存器加缓存的那套语义效果。
也别觉得 volatile 能直接让 counter++ 变得安全——volatile 只管单次读或写的可见性,而“读-改-写”这三步之间没有原子性保证。
更不要把 JMM 和堆内存溢出、GC 日志混为一谈,那是 JVM 内存结构层面的东西,和 JMM 压根不在同一个维度。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8