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、竞争现象

相关推荐
CodeAmaz7 分钟前
自定义限流方案(基于 Redis + 注解)
java·redis·限流·aop·自定义注解
FAREWELL0007512 分钟前
Lua学习记录(3) --- Lua中的复杂数据类型_table
开发语言·学习·lua
Felix_XXXXL20 分钟前
Plugin ‘mysql_native_password‘ is not loaded`
java·后端
IT北辰22 分钟前
Python实现居民供暖中暖气能耗数据可视化分析(文中含源码)
开发语言·python·信息可视化
韩立学长23 分钟前
【开题答辩实录分享】以《基于SpringBoot在线小说阅读平台》为例进行答辩实录分享
java·spring boot·后端
悟能不能悟30 分钟前
jsp怎么拿到url参数
java·前端·javascript
KWTXX30 分钟前
组合逻辑和时序逻辑的区别
java·开发语言·人工智能
高山上有一只小老虎33 分钟前
字符串字符匹配
java·算法
wjs202440 分钟前
Go 语言结构体
开发语言
程序猿小蒜44 分钟前
基于SpringBoot的企业资产管理系统开发与设计
java·前端·spring boot·后端·spring