java 内存模型 ——学习笔记

 2019-12-10 15:42  阅读(873)
文章分类:Java Core

一、Java 内存模型

java内存模型把 Java 虚拟机内部划分为线程栈和堆

20191210001219\_1.png

下面这张图演示了调用栈和本地变量存放在线程栈上,对象存放在堆上。

20191210001219\_2.png ==》》 20191210001219\_3.png

一个局部变量可能是原始类型,在这种情况下,它总是“呆在”线程上。

一个局部变量也可能是指向一个对象的一个引用。在这种情况下,引用(这个本地变量)存放在线程栈上,但是对象本身存放在堆上

一个对象可能包含方法,这些方法可能包含局部变量。这些本地变量任然存放在线程栈上,即使这些方法所属的对象存放在堆上。

一个对象的成员变量可能随着这个对象自身存放在上。不管这个成员变量是原始类型还是引用类型。

静态成员变量跟随着类定义一起也存放在上。

存放在堆上的对象可以被所有持有对这个对象引用的线程访问。当一个线程可以访问一个对象时,它也可以访问这个对象的成员变量。如果两个线程同时调用同一个对象上的同一个方法,它们将会都访问这个对象的成员变量(共享),但是每一个线程都拥有这个方法内局部变量的私有拷贝。

二、计算机硬件内存模型

20191210001219\_4.png

三、java内存模型与硬件内存架构之间桥接

Java 内存模型与硬件内存架构之间存在差异。硬件内存架构没有区分线程栈和堆。对于硬件,所有的线程栈和堆都分布在主内中。部分线程栈和堆可能有时候会出现在 CPU 缓存中和 CPU 内部的寄存器中。

20191210001219\_5.png

当对象和变量被存放在计算机中各种不同的内存区域中时,就可能会出现一些具体的问题。主要包括如下两个方面:

  • 线程对共享变量修改的可见性 =》共享变量加上volatile 关键字
  • 当读,写和检查共享变量时出现 race conditions =》同步解决,同步块还可以保证代码块中所有被访问的变量将会从主存中读入,当线程退出同步代码块时,所有被更新的变量都会被刷新回主存中去,不管这个变量是否被声明为 volatile。
点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> java 内存模型 ——学习笔记

相关推荐