JMM 内存模型

一句话描述JMM:

JMM是一种和多线程相关的规范,有了这种规范,相同的并发程序,才能在不同的虚拟机上得到相同的结果。

JMM抽象出主存储器和工作存储器两种:

主存储器对应实例对象,所有线程共享;

工作存储器对应线程所拥有的作业区,存有主存储器中的必要部分拷贝;

这样的方式使得线程与线程之间只能通过主存来进行通信。

为什么需要这种规范

计算机在执行程序时,每条指令都是在CPU中执行的。而执行指令的过程中,势必涉及到数据的读取和写入。由于程序运行过程中临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程,跟执行命令的速度比起来要慢的多(硬盘<内存<缓存cache<CPU)。因此在CPU里面就有了高速缓存。也就是当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么在CPU进行计算式,就可以直接从它的高速缓存中读取数据或向其写入数据了。当运算结束后,在将高速缓存中的数据刷新到主存当中。

特性

原子性

一个或者多个操作,要么全部执行,要么全部不执行(过程不会被打断)。

可见性

只要有一个线程将共享变量进行了修改,其他线程将马上收到通知,立刻获得最新值

有序性

在同一线程内,代码的执行是有序的;而在多线程的情况下,有些操作可能是无序的

为了解决一些问题在java中要用到一些关键字来保证有序性,之前有写过相关的文章

https://blog.csdn.net/Eugene__Chen/article/details/135776207

操作方法

为了支持JMM,java定义了8中原子操作,用来控制主存和工作内存之间的交互:

.read读取:作用于主内存,将共享变量从主存传送到线程的工作内存中。

.load载入:作用于工作内存,把read读取的值放到工作内存的副本变量中。

.store存储:作用于工作内存,把工作内存中的变量传送到主内存中。

.write写入:作用于主内存,把工作内存中store传过来的值写到主内存的变量中。

.use使用:作用于工作内存,把工作内存得值传递给执行引擎,当虚拟机遇到一个需要使用这个变量的命令时,就会执行这个动作。

.assign赋值:作用于工作内存,把执行引擎获取到的值赋值给工作内存中的变量,当虚拟机栈遇到给变量赋值的命令时,就执行此操作

.lock锁定:作用于主内存,把变量标记为线程独占状态。

.unlock解锁:作用于主内存,它将释放独占状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值