【Java】【JVM】主内存和工作内存

前言:了解JVM内存模型

内容

参考JVM内存模型,可分为主内存和工作内存。

  • 主内存:所有的线程所共享的,主要包括本地方法区和堆
  • 工作内存:每个线程都有一个工作内存不是共享的
    • 一个是属于该线程私有的栈
    • 对主存部分变量拷贝的寄存器
  1. 所有的变量都存储在主内存中(虚拟机内存的一部分),对于所有线程都是共享的。
  2. 每条线程都有自己的工作内存,工作内存中保存的是主存中某些变量的拷贝,
    线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。
  3. 线程之间无法直接访问对方的工作内存中的变量,线程间变量的传递均需要通过主内存来完成,即:线程、主内存、工作内存。

内存交互

  • Lock(锁定):作用于主内存中的变量,把一个变量标识为一条线程独占的状态。

  • Read(读取):作用于主内存中的变量,把一个变量的值从主内存传输到线程的工作内存中。

  • Load(加载):作用于工作内存中的变量,把read操作从主内存中得到的变量的值放入工作内存的变量副本中。

  • Use(使用):作用于工作内存中的变量,把工作内存中一个变量的值传递给执行引擎。

  • Assign(赋值):作用于工作内存中的变量,把一个从执行引擎接收到的值赋值给工作内存中的变量。

  • Store(存储):作用于工作内存中的变量,把工作内存中的一个变量的值传送到主内存中。

  • Write(写入):作用于主内存中的变量,把store操作从工作内存中得到的变量的值放入主内存的变量中。

  • Unlock(解锁):作用于主内存中的变量,把一个处于锁定状态的变量释放出来,之后可被其它线程锁定。

    在将变量从主内存读取到工作内存中,必须顺序执行read、load;
    要将变量从工作内存同步回主内存中,必须顺序执行store、write。
    

交互原则

  1. 不允许read和load、store和write操作之一单独出现。
    • 不允许一个变量从主内存被读取了,但是工作内存不接受,或者从工作内存回写了但是主内存不接受。
  2. 不允许一个线程丢弃它最近的一个assign操作
    • 变量在工作内存被更改后必须同步改更改回主内存。
  3. 工作内存中的变量在没有执行过assign操作时,不允许无意义的同步回主内存。
  4. 在执行use前必须已执行load,在执行store前必须已执行assign。
  5. 一个变量在同一时刻只允许一个线程对其执行lock操作,
    • 一个线程可以对同一个变量执行多次lock,但必须执行相同次数的unlock操作才可解锁。
  6. 一个线程在lock一个变量的时候,将会清空工作内存中的此变量的值,执行引擎在use前必须重新read和load。
  7. 线程不允许unlock其他线程的lock操作,并且unlock操作必须是在本线程的lock操作之后。
  8. 在执行unlock之前,必须首先执行了store和write操作。

参考

  • https://www.cnblogs.com/songpingyi/p/9121745.html
  • https://blog.csdn.net/zhanghai412/article/details/115548832
posted @ 2023-04-02 11:25  CryDongle  阅读(23)  评论(0编辑  收藏  举报  来源