JMM随笔

What?

  Java内存模型(Java Memory Model,JMM)主要是为了规定了线程和内存之间的一些关系。

  根据JMM的设计:

  •   系统存在一个主内存(Main Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。
  •   每条线程都有自己的工作内存(Working Memory),
  •   工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成

在多线程环境下,线程之间的要通信,就不得不提JMM(java内存模型) 
在JVM内部使用的java内存模型(JMM)将线程堆栈和堆之间的内存分开 
线程堆栈(thread stack):

1.运行在java虚拟机上的每个线程都有自己的线程堆栈(thread stack)

2.线程堆栈还包含正在执行的每个方法的所有局部变量,一个线程只能访问它自己的线程堆栈。由线程创建的局部变量对于除创建它的线程之外的所有其他线程都是不可见的。

3.即使两个线程正在执行完全相同的代码,两个线程仍然会在每个线程堆栈中创建该代码的局部变量,一个线程可能会将一个有限变量的副本传递给另一个线程,但它不能共享原始局部变量本身

堆:

1.堆包含在Java应用程序中创建的所有对象,而不管是不是由线程创建的该对象。

2.堆中的对象可以被具有对象引用的所有线程访问。当一个线程访问一个对象时,它也可以访问该对象的成员变量。

3.如果两个线程同时调用同一个对象上的一个方法,它们都可以访问该对象的成员变量,但每个线程都有自己的局部变量副本

4.堆中的数据是共享的,线程不安全的

JVM与JMM的关系 

jmm中的主内存、工作内存与jvm中的Java堆、栈、方法区等并不是同一个层次的内存划分,这两者基本上是没有关系的,如果两者一定要勉强对应起来,那从变量、主内存、工作内存的定义来看,主内存主要对应于Java堆中的对象实例数据部分,而工作内存则对应于虚拟机栈中的部分区域。从更低层次上说,主内存就直接对应于物理硬件的内存,而为了获取更好的运行速度,虚拟机(甚至是硬件系统本身的优化措施)可能会让工作内存优先存储于寄存器和高速缓存中,因为程序运行时主要访问读写的是工作内存。

原文地址:https://www.cnblogs.com/lsgspace/p/10432486.html