深入JVM 内存间交互操作

Javan内存模型定义了8种操作来完成主内存与工作内存的读写交互,虚拟机实现保证每一种操作都是原子的,不可再分的

Lock锁定 作用于主内存变量,将变量标志为一条线程所独占
Unlock解锁 作用于主内存变量,将处于锁定的变量释放出来
Read读取 作用于主内存变量,它将一个变量的值从主内存传输到线程的工作内存中
Load载入 作用于工作内存变量,它把从主内存读取的变量值放入工作内存的副本中
Use使用 作用于工作内存变量,将工作内存变量值传递给执行引擎
Assgin赋值 作用于工作内存变量,将执行引擎的值传递给工作内存的变量
Store存储 作用于工作内存变量,它把工作内存变量传递到主内存中
Write写入 作用于主内存变量,把Store操作从工作内存得到的变量值放入主内存变量中
  • 如果要把一个变量的值从主内存复制到工作内存,那么需要执行read load操作
  • 如果要把一个变量的值从工作内存同步回主内存,那么需要执行store write操作

Java内存模型这2个操作必须顺序执行,但不保证连续执行,即在指令之间可以插入其它指令

但是Java内存模型规定了一些必要的规则

  1. 不允许read load    store write单独出现,即不允许一个变量读取到工作内存,但没有变量接收的情况
  2. 不允许一个线程丢弃它的assign操作,即变量在工作内存改变必须同步回主内存
  3. 不允许一个线程无原因(没有发生assgin赋值操作)把数据从线程的工作内存同步会主内存
  4. 一个新的变量只能在主内存中诞生,不允许在工作内存中直接使用未被初始化的变量
  5. 一个变量同一时刻只允许一条线程对其进行Lock锁定,但Lock操作可以被同一线程重复执行
  6. 如果对一个变量执行Lock锁定,会清空工作内存中该副本的值,即执行引擎使用该值会重新load assgin操作初始化该值
  7. 如果一个变量事先没有被Lock锁定,那就不允许进行Unlock操作,也不允许Unlock其它线程锁定的变量
  8. 对一个变量执行Unlock操作,必须先把此变量值同步回主内存(store write操作)

这些规定确保了一些基本的并发操作的一致性

猜你喜欢

转载自blog.csdn.net/qq_33369979/article/details/88546882