一、处理器、高速缓存、主内存之前的交互图
二、Java内存模型
俩张图之间的关系很清晰
一个处理器对应一个线程
一个高速缓存对应一个工作内存
问题的关键点就在于:java线程之间与工作内存打交道,而不是主内存,工作内存之间没有直接的关联,都是要与主内存交互,并发关键点就在此。
三、内存间8种交互操作
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操作)