Javan内存模型定义了8种操作来完成主内存与工作内存的读写交互,虚拟机实现保证每一种操作都是原子的,不可再分的
Lock锁定 | 作用于主内存变量,将变量标志为一条线程所独占 |
Unlock解锁 | 作用于主内存变量,将处于锁定的变量释放出来 |
Read读取 | 作用于主内存变量,它将一个变量的值从主内存传输到线程的工作内存中 |
Load载入 | 作用于工作内存变量,它把从主内存读取的变量值放入工作内存的副本中 |
Use使用 | 作用于工作内存变量,将工作内存变量值传递给执行引擎 |
Assgin赋值 | 作用于工作内存变量,将执行引擎的值传递给工作内存的变量 |
Store存储 | 作用于工作内存变量,它把工作内存变量传递到主内存中 |
Write写入 | 作用于主内存变量,把Store操作从工作内存得到的变量值放入主内存变量中 |
- 如果要把一个变量的值从主内存复制到工作内存,那么需要执行read load操作
- 如果要把一个变量的值从工作内存同步回主内存,那么需要执行store write操作
Java内存模型这2个操作必须顺序执行,但不保证连续执行,即在指令之间可以插入其它指令
但是Java内存模型规定了一些必要的规则
- 不允许read load store write单独出现,即不允许一个变量读取到工作内存,但没有变量接收的情况
- 不允许一个线程丢弃它的assign操作,即变量在工作内存改变必须同步回主内存
- 不允许一个线程无原因(没有发生assgin赋值操作)把数据从线程的工作内存同步会主内存
- 一个新的变量只能在主内存中诞生,不允许在工作内存中直接使用未被初始化的变量
- 一个变量同一时刻只允许一条线程对其进行Lock锁定,但Lock操作可以被同一线程重复执行
- 如果对一个变量执行Lock锁定,会清空工作内存中该副本的值,即执行引擎使用该值会重新load assgin操作初始化该值
- 如果一个变量事先没有被Lock锁定,那就不允许进行Unlock操作,也不允许Unlock其它线程锁定的变量
- 对一个变量执行Unlock操作,必须先把此变量值同步回主内存(store write操作)
这些规定确保了一些基本的并发操作的一致性