Java内存模型

JVM(三)

Java内存模型指的是JMM(Java Memory Model)、是Java虚拟机规范中定义的一种模型、试图屏蔽硬件和操作系统的内存的访问差异的,为了让Java程序在各种的平台达到一致的内存访问效果。
Java内存模型的主要的目的就是定义程序中的各种变量的访问的规则的、也就关注的是在虚拟机中将变量存储在内存中、和从内存中取值的细节。这里的变量指的是实列字段、静态的字段、构成数组对象的元素。不包括局部的变量和方法参数、因为这些都是线程私有的。
JMM规定了所有的变量存储在主内存中、每个线程都有自己的工作内存、而线程自己的工作的内存又保存了被该线程使用的变量的主内存的副本、线程对变量的所有的操作都必须在工作内存中进行,而不能直接的读写主内存的数据。线程之间无法访问彼此的工作内存、线程之间值的传递要靠主内存来完成,线程、主内存、工作内存之间的关系如图所示👇

在这里插入图片描述

那么主内存和线程之间的工作内存之间要如何交互呢?也就是交互的规则是什么呢?JMM定义了👇八种的操作来实现二者之间的交互、并且每一种的操作都要是原子性的、不可再分的(long、double类型的变量有例外)

lock(锁定):作用于主内存的变量,将变量标识为一条线程独占的状态

unlock(解锁):作用于主内存的变量,将一个处于锁定状态的变量释放出来、释放后的变量才能被其它的线程锁定

read(读取):作用于主内存的变量、这个操作将主内存的变量传输到线程的工作内存中、以便load操作的使用

load(载入):作用于工作内存变量,负责将read的变量的值放入到工作内存的变量的副本中

use(使用):作用于工作内存变量,把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。

assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作

store(存储):作用于工作内存变量,把工作内存中一个变量的值传送到主存。

write(写入):作用于主存变量,把 store 操作从工作内存中得到的变量的值放入主存的变量中。

通过上面的内存交互规则,如果要把一个变量从主内存复制到工作内存, 就需要顺序的执行read和load操作,而如果要把一个变量从工作内存同步回主内存,则需要顺序执行store和write操作,注意是顺序执行,而不是连续执行,也就是两个操作之间可以插入其他操作。除此之外,JMM对这8中操作进行操作的其他约束:

1.不允许read和load、store和write操作之一单独出现。也就是不允许一个变量从主内存读取到工作内存但是不接受、或者是工作内存发起了写回操作但是主内存不接受的情况
2.不允许线程丢弃它的最近的assign操作,即变量在工作内存中改变之后,必须同步回主内存。
3.不允许线程把没有经过assign操作的变量,同步回主内存。
4.一个新的变量只能在主内存中诞生,即对一个变量进行use、store操作之前,必须先执行过load、assign操作。
5.一个变量在同一时刻只能被一条线程执行lock操作,一旦lock成功,可以被同一线程重复lock多次,多次执行lock之后,只有执行相同次数的unlock操作,变量才会被解锁。
6.对一个变量执行lock操作,将会清空工作内存中该变量的值,所以在执行引擎使用这个变量前,需要重新执行load或assign操作对其进行初始化。
7.如果一个变量事先没有被lock操作锁定,那就不允许对它执行unlock操作,也不允许unlock一个被其他线程lock的变量。
8.对一个变量执行unlock操作之前,必须先把该变量同步回主内存(执行store、write操作)。

这些规则是Java内存访问在并发下安全的保证之一。

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值