java内存模型与线程(1)

 2019-12-10 16:09  阅读(881)
文章分类:Java Core

一、处理器、高速缓存、主内存之前的交互图

20191210001615\_1.png

二、Java内存模型

20191210001615\_2.png

俩张图之间的关系很清晰

一个处理器对应一个线程

一个高速缓存对应一个工作内存

问题的关键点就在于:java线程之间与工作内存打交道,而不是主内存,工作内存之间没有直接的关联,都是要与主内存交互,并发关键点就在此。

三、内存间8种交互操作

20191210001615\_3.png

1. 8种交互操作的含义

lock:作用于主内存的变量,把一个变量标识为一条线程独占的状态

unlock:作用于主内存的变量,把一个处于锁定的变量释放出来

read:作用于主内存的变量,把一个变量的值从主内存传输到工作内存

load:把read操作从主内存中得到的变量值放入工作内存的变量副本中

use:作用于工作内存中的变量,把工作内存中变量的值传递给执行引擎

assign:作用于工作内存中的变量,从执行引擎收到的值给工作内存中的变量

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

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

2. 8种基本操作满足的规则

1)read 和 load 成对出现, store 和 write 成对出现

2)不允许丢弃assign,即工作内存中改变后必须变化同步回主内存

3)没有任何assign操作,不允许把数据从线程的工作内存同步到主内存

4)新的变量诞生只能从主内存中诞生,不能在工作内存中诞生,因为工作内存中只是副本

5)只允许一个线程对其进行lock操作,同一个线程可以多次lock,但是需要多次unlock解锁

6)对一个变量lock操作,会清空工作内存中的此变量的值,使用时需要重新load或assign操作初始化变量的值

7)unlock操作一定在lock操作之后

8)对变量unlock操作之前,必须先把变量同步回主内存中(执行store、write操作)

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> java内存模型与线程(1)

相关推荐