并发--JMM,内存间交互操作和内存交互必须满足的规则

2019-03-29  本文已影响0人  简书徐小耳

JMM

主内存和工作内存交互需要的八种操作

lock

unlock

read

load

use

assign

store

write

总结可以通过lock获取对变量的操作权限,通过unlock释放,通过read先把变量读取到工作内存,然后通过load把变量值放入到工作内存中的变量副本。
我们使用变量进行操作(use),给变量赋值(assign),通过store把工作内存中的变量值传递到主内存,通过write把该值写入到主内存中的变量。

上述操作必须满足的规则

read 和load,store和write必须成对出现,且顺序如当前所示,但是不需要连续执行比如read和load之间可以插入其他的指令。

不允许一个线程丢弃它最近的assign的操作,最近是指最后一次的赋值,赋值之后的改变必须同步回主内存。

不允许一个线程无原因地(没有发生过任何assign操作的)把数据从线程的工作内存同步回主内存。

一个新的变量只能在主内存中诞生,对一个变量使用store和use之前必须先使用load和assign

一个变量只能在同一时刻被一个线程锁定,但是lock操作可以被同一个线程重复执行多次,但是对应的unlock也需要执行相同次数。

对变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用此变量前,需要重新执行load或assign操作初始化变量的值。

未被lock的变量不允许unlock

对一个变量执行unlock操作之前,必须把此变量同步回主内存中(执行store和write操作)

上述的操作是指jvm规定对一个主内存操作的时候需要进行的步骤,其中lock和unlock可以通过字节码指令和咱们的并发包,而对于lock和unlock对变量的操作底层涉及到内存屏障

JMM主要是围绕并发过程中的原子,有序,可见性

原子性

可见性

有序

上一篇下一篇

猜你喜欢

热点阅读