java 内存模型 ——学习笔记

一、Java 内存模型

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

 

《java 内存模型 ——学习笔记》

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

《java 内存模型 ——学习笔记》     ==》》 《java 内存模型 ——学习笔记》

 

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

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

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

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

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

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

 

二、计算机硬件内存模型

 《java 内存模型 ——学习笔记》

 

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

 

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

 《java 内存模型 ——学习笔记》

 

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

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

 

    原文作者:牛哥学coding
    原文地址: http://www.cnblogs.com/lwcoding/p/6656589.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞