JMM 理解

JMM: Java Memory Model (JAVA内存模型)

【JMM】 允许编译器和缓存以数据在处理器特定的缓存(或寄存器)和主存之间的移动次序拥有重要的特权。 非程序员使用了volatitlesynchronized明确请求了某些可见性的保证。

从几个方面学习

1、什么是JMM?

答:JVM是Java实现的虚拟计算机(Java Virtual Machine), 对于熟悉计算机结构的同学,我感觉把这些概念和物理机对应起来更好理解

JVM对应的就是物理机,它有存放数据的存储区:堆、栈等由JVM管理的内存(对应于物理机的内存)、执行数据计算的执行单元:线程(对应于物理机的CPU)、加速线程执行的本次存储区:可能会从 存储区里分配一块空间来存储线程本地数据,比如栈(对应于物理机的Cache)。

众所周知,现代计算机一般都会包含多个处理器,多个处理器共享主内存。为了提升性能,会在每个处理器上增加一个小容量的cache加速数据读写,cache会导致了缓存一致性问题,为了解决缓存一致性问题,又引入了一系列Cache一致性协议(比如 MSI、MESI、MOSI、Synapse、Firefly及Dragon Protocol)来解决CPU本地缓存和主内存数据不一致问题。

而JVM中管理下的存储空间(包括堆、栈等)就对应与物理机的内存;

线程本次存储区(例如栈) 就对应于物理机的cache;


JMM 就对应于类似于MSI、MESI、MOSI、Synapse、Firefly及Dragon Protocol 这样的缓存一致性协议 ,用于定义数据读写的规则

JMM 相对于物理机的缓存一致性协议来说它还要处理JVM自身特有的问题:重排序问题
JMM都有哪些内容呢?

定义了 Java程序中的变量、线程如何和主存以及工作内存进行交互的规则。它主要涉及到多线程环境下的共享变量可见性、指令重排等问题,是理解并发编程中的关键概念。

并发编程的线程之间存在两个问题:

1、线程间如何通信?即: 线程之间以何种机制来交换信息

2、线程间如何同步?即: 线程以何种机制来控制不同线程间发生的相对顺序

有两种并发模型可以解决这两个问题:

1、消息传递并发模型

2、共享内存并发模型

这两种模型之间的区别如下图所示:

Java使用的是 共享内存并发模型

Java内存模型:

什么是共享变量?

先来看一下 运行时数据区,相信大家一点都不陌生

对于每一个线程来说,栈都是私有的,而堆是公有的。

也就是说,在栈中的变量(局部变量、方法定义的参数、异常处理的参数)不会在线程之间共享,也就不会有内存可见性的问题,也不受内存模型的影响。而在堆中的变量是共享的,一般称之为 共享变量。

所以,内存可见性 针对的是 堆中的共享变量
内存可见性问题是如何发生的?

那可能就有小伙伴会问: 既然堆是共享的,为什么在堆中会有内存不可见问题?

2、它干嘛用的?

为了解决缓存一致性问题,又引入了一系列Cache一致性协议(比如 MSI、MESI、MOSI、Synapse、Firefly及Dragon Protocol)来解决CPU本地缓存和主内存数据不一致问题

JMM(Java内存模型带来的问题)?

1、可见性问题

2、竞争现象

相关推荐
天上飞的粉红小猪1 分钟前
线程概念&&控制
linux·开发语言·c++
LFly_ice1 分钟前
Nest-管道
android·java·数据库
剽悍一小兔2 分钟前
为什么使用postman发送请求时不会有跨域问题?
java
Cherry的跨界思维3 分钟前
19、自动化处理双核心:Java规则引擎与Python Selenium实战全解析
java·开发语言·python·自动化·办公自动化·python办公自动化·python办公
muyouking1125 分钟前
Zig 类型系统探索_1:从指针、浮点数到字符串的实践指南
开发语言
hunter19901029 分钟前
Spring线程池ThreadPoolTaskExecutor配置与实践
java·后端·spring
hz_zhangrl31 分钟前
CCF-GESP 等级考试 2025年9月认证C++五级真题解析
开发语言·数据结构·c++·算法·青少年编程·gesp·2025年9月gesp
皇族崛起39 分钟前
【docker安装部署】- 一个可用的Docker 镜像配置 和 DNS配置
java·docker·容器
程序喵大人40 分钟前
Duff‘s device
c语言·开发语言·c++
互亿无线明明1 小时前
国际短信通知服务:如何为全球业务构建稳定的跨国消息触达体系?
java·c语言·python·php·objective-c·ruby·composer