一文带你深入理解JVM内存模型

本文详细探讨了JAVA内存模型的并发模型,强调了共享内存模型中线程间通过主内存进行通信。文章介绍了线程间通讯的本质,讨论了重排序的各种类型及其对内存可见性的影响,并详细阐述了内存屏障指令、happens-before原则以及数据竞争和顺序一致性内存模型的概念。此外,还强调了在非同步场景下,JVM内存模型与顺序一致性模型的执行差异。
摘要由CSDN通过智能技术生成

一、JAVA的并发模型

共享内存模型

在共享内存的并发模型里面,线程之间共享程序的公共状态,线程之间通过读写内存中公共状态来进行隐式通信

该内存指的是主内存,实际上是物理内存的一小部分

二、JAVA 内存模型的抽象

1、java内存中哪些数据是线程安全的,哪些是非安全的

非线程安全:

在java中所有的实例域、静态域、和数组元素都存放在堆内存中,并且这些数据是线程共享的,所以会存在内存可见性问题

线程安全

局部变量、方法定义的参数、异常处理器参数是当前线程的虚拟机栈中的数据,并且不会进行线程共享,所以不会存在内存可见性问题

2、线程间通讯的本质

线程间通讯的本质是

JMM即JAVA内存模型进行控制,JMM决定了一个线程对共享变量的写入何时对其他线程可见。

image.png

由上图能看出来线程间的通讯都是通过主内存来进行传递消息的, 每个线程在进行共享数据处理的时候都是将共享的数据复制到当前线程本地(每个线程自己都有一个内存)来进行操作。

消息通讯过程(不考虑数据安全性的问题)

线程一将主内存中的共享变量 A 加载到自己的本地内存中进行处理。比如 A = 1;
此时将修改的共享变量 A 刷入到主内存中, 之后线程二再将主内存中的共享变量 A 读取到本地内存进行操作;
整个数据交互的过程是JMM控制的,主要控制主内存与每个线程的本地内存如何进行交互来提供共享数据的可见性

三、重排序

程序在执行的时候为了提高效率会将程序指令进行重新排序

1、重排序分类

编译器优化重排序

编译器在不改变单线程程序语义的情况下进行语句执行顺序的优化

指令集并行重排序

如果不存在数据的依赖性的话,处理器可以改变语句对应机器指令的执行顺序

内存系统重排序

由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行

2、重排序过程

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值