JMM(Java Memory Model)是java内存模型,是一种规范、规则,一种抽象的概念。通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。那么JMM规定的访问方式是怎样的,JMM规定,所有的变量必须存储在主内存当中,每个线程访问主内存的变量时,不能直接访问,而是在本线程内开辟一块工作内存,将主内存中的变量复制到工作内存中,线程才可以进行访问。
- 主内存:存储Java实例对象。
- 工作内存:存储当前方法的所有本地变量信息(工作内存中存储着主内存中的变量副本拷贝)。
JVM是java虚拟机,是负责管理内存的。JMM是java内存模型,是一种抽象的概念,并不真实存在,规定了程序中各个变量的访问方式,侧重于围绕原子性、有序性、可见性。
JMM与硬件内存架构的关系前面我们说到,JMM是并不真实存在的,在硬件内存中并不知道JMM内存模型的存在,因此,多线程的执行最终还是会回归到硬件架构中。
为什么需要JMM假设我们遇到了以下场景:
现在我有两个线程,分别是线程A、线程B,在JMM规范下,他们是有各自的工作内存的,假设现在他们分别要对主内存共享变量x=6进行修改 *** 作,A想要修改x为1,B想要修改x为2,那么x最终的结果是不确定的,要看先执行谁,这就导致了主内存与工作内存数据不一致性的问题。因此我们需要JMM协议去规范这一些问题。
原子性顾名思义,是指 *** 作是不可中断的、一气呵成的。
JMM保证原子性:JMM协议是通过synchronized关键字去保证原子性的。
有序性在cpu执行指令时,他会对指令进行优化,也就是我写在下面的代码有可能在cpu指令优化的作用下提前执行,但是前提都是保证我们的执行结果是正确的。但有时指令优化也会带来一系列的问题,因此需要去保证有序性。
JMM保证有序性:JMM协议是通过volatile关键字去保证原子性的。
可见性可见性是指一个线程能否读到变量x最新的值,因为变量x有可能会被其他线程修改值。
JMM保证可见性:JMM协议是通过volatile关键字去保证原子性的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)