怎么理解 Java 内存模型(JMM)中的主内存与工作内存的交互规范

千墨吖_7393

千墨吖_7393

2026-05-05

908人浏览

原创

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

怎么理解 java 内存模型(jmm)中的主内存与工作内存的交互规范

Java 内存模型(JMM)里的“主内存”和“工作内存”不是 JVM 运行时数据区(比如堆、栈)的物理划分,而是为描述线程间共享变量如何交互而抽象出来的概念。理解它们的交互规范,关键在于抓住三点:谁存什么、怎么传、何时同步。

主内存与工作内存分别存什么

主内存存储所有线程共享的变量——包括实例字段、静态字段、数组元素。这些是真实可被多线程读写的“源头数据”。
工作内存是每个线程私有的“副本空间”,它不存对象本身,只保存该线程当前用到的那些共享变量的本地副本。局部变量、方法参数不在 JMM 管理范围内,因为它们天然在线程栈帧里,不涉及共享。

8 种交互操作必须成对且有序

JMM 用 8 个原子操作定义变量如何在两者之间流动,它们不能拆分,也必须按规则组合:

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载
  • 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 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

60

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

40

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

40

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

40

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

40

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

240

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

160

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

120

15

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

2026.09.22

80

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习