java 内存模型 ——学习笔记

Posted 牛哥来coding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 内存模型 ——学习笔记相关的知识,希望对你有一定的参考价值。

一、Java 内存模型

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

 

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

     ==》》 

 

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

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

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

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

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

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

 

二、计算机硬件内存模型

 

 

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

 

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

 

 

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

  • 线程对共享变量修改的可见性                                =》共享变量加上volatile 关键字
  • 当读,写和检查共享变量时出现 race conditions       =》同步解决,同步块还可以保证代码块中所有被访问的变量将会从主存中读入,当线程退出同步代码块时,所有被更新的变量都会被刷新回主存中去,不管这个变量是否被声明为 volatile。

 

以上是关于java 内存模型 ——学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Java内存模型学习笔记

学习笔记JVM之内存模型

Java内存学习笔记-运行时数据区域划分

深入理解Java虚拟机- 学习笔记 - Java内存模型与线程

volatile 学习笔记

细说Java多线程之内存可见性:学习笔记