深入理解JVM-Java内存模型与线程

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

主要考虑线程、工作内存和主内存三者的关系,关于变量在工作内存和主内存的同步,JVM定义了8种原子操作:

  • lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。
  • unlock(解锁):作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
  • read(读取):作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用
  • load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。
  • use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。
  • assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
  • store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作。
  • write(写入):作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中。

20191210001659\_1.png

主内存:lock、unlock

主内存 工作内存

read->load->use

write<-store<-assign 加粗和下划线顺序执行,并非连续执行,中间可插入其他指令

如果对一个变量执行lock操作,那将会清空工作内存中此变量的值,在执行引擎使用这个变量前,需要重新执行load或assign操作初始化变量得值

对一个变量执行unlock操作之前,必须先把此变量同步回主内存中

以上即时synchronized和Reentrantlock可以类似volatile保证可见性的原因,volatile可以保证可见性和指令重排序,详细参考

http://www.cnblogs.com/dolphin0520/p/3920373.html

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

相关推荐