天天看点

Java并发编程 - Java内存模型(JMM)

Java内存模型与硬件内存架构的关系

通过对前面的硬件内存架构、Java内存模型以及Java多线程的实现原理的了解,我们应该已经意识到,多线程的执行最终都会映射到硬件处理器上进行执行,但Java内存模型和硬件内存架构并不完全一致。对于硬件内存来说只有寄存器、缓存内存、主内存的概念,并没有工作内存(线程私有数据区域)和主内存(堆内存)之分,也就是说Java内存模型对内存的划分对硬件内存并没有任何影响,因为JMM只是一种抽象的概念,是一组规则,并不实际存在,不管是工作内存的数据还是主内存的数据,对于计算机硬件来说都会存储在计算机主内存中,当然也有可能存储到CPU缓存或者寄存器中,因此总体上来说,Java内存模型和计算机硬件内存架构是一个相互交叉的关系,是一种抽象概念划分与真实物理硬件的交叉。(注意对于Java内存区域划分也是同样的道理)。

Java并发编程 - Java内存模型(JMM)
Java并发编程 - Java内存模型(JMM)
Java并发编程 - Java内存模型(JMM)
  • 整个是个JVM,但是“线程-工作内存-主内存”属于JMM。
  • JVM将内存组织为主内存和工作内存两个部分。
  • 主内存主要包括本地方法区和堆。每个线程都有一个工作内存,工作内存中主要包括两个部分,一个是属于该线程私有的栈和对主存部分变量拷贝的寄存器(包括程序计数器PC和CPU工作的高速缓存区)。

    1、所有的变量都存储在主内存中(虚拟机内存的一部分),对于所有线程都是共享的。

    2、每条线程都有自己的工作内存,工作内存中保存的是主存中某些变量的拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。

    3、线程之间无法直接访问对方的工作内存中的变量,线程间变量的传递均需要通过主内存来完成。

JMM是一个规范,规范Java虚拟机与计算机内存是如何协同工作的,规定一个线程如何和何时能够看到其他线程修改过的共享变量的值以及在必须时如何同步地访问共享变量。 为了屏蔽硬件和操作系统的内层的访问差异,以实现让JAVA程序在各种平台上一致的并发效果,Java虚拟机规范中定义了“Java内存模型”。

Heap(堆):运行时的数据区,是由垃圾回收负责;

  • 优势:可以动态分配内存大小,生存期也不必事先告诉编译器,运行时动态分配内存,垃圾回收器会在不需要使用这些内存时,回收掉;
  • 缺点:因为时运行时动态分配内存,所以存储速度相对慢一些。

Stack(栈):栈内存储基本类型变量,列入:小写的int,char......

  • 优势:存储速度比堆快,仅次于计算机的寄存器,栈的内存是可以共享的;
  • 缺点:存在栈内的数据大小与生存期必须是确定的,缺乏灵活性。
Java并发编程 - Java内存模型(JMM)
Java并发编程 - Java内存模型(JMM)
  • 每一个CPU都有一系列的寄存器 CPU在寄存器上执行的速度,远大于在主存上执行的速度。由于计算机的存储设备与处理器的预算速度之间,有几个数量级的差距,所以计算机系统不得不加入一层读写速度接近处理器运算速度的高级缓存,作为内存与处理器之间的缓冲,将运算需要的数据复制到缓存中,当运算结束后,再从缓存同步到内存中。
  • JAVA内存模型要求:调用栈和本地模型存放在栈,对象存放在堆上 对一个对象的引用(包含这个对象的变量、方法)是在栈上,这个对象本身是在堆上,一个对象的成员变量可能会随着对象自身存在堆上,不管这个变量是原始类型,还是引用类型,静态成员变量跟随类的定义一起存放在堆上;放在堆上的对象可以被所持有对这个对象引用的线程访问。当一个线程可以访问一个对象的时候,也可以访问这个对象的成员变量。如果两个线程同时访问一个对象的同一个方法,他们将会都访问成员变量,但是每一个线程都拥有这个成员变量的私有拷贝。
Java并发编程 - Java内存模型(JMM)
  • 当CPU需要读取主存内容时,可以把数据读到缓存中,然后读取到寄存器中执行操作,当CPU需要回显结果时候,会将内部寄存器的值刷新到缓存中,然后某个时间点回显到主存中。
Java并发编程 - Java内存模型(JMM)
  • 线程和主内存之间抽象的关系:Java内存模型(JVM)只是对内存的物理划分,只局限在内存,而且是只局限在JVM的内存,线程间的通信必须经过主内存。
  • 每个线程都有一个私有的本地内存,当线程A需要读取主内存共享变量时拷贝共享变量的副本,放到本地,主内存就是硬件内存是为了获取更好的运行速度,虚拟机和硬件系统可能会让工作内存优先存储于寄存器和高速缓存中。
Java并发编程 - Java内存模型(JMM)
Java并发编程 - Java内存模型(JMM)
Java并发编程 - Java内存模型(JMM)
Java并发编程 - Java内存模型(JMM)
Java并发编程 - Java内存模型(JMM)

继续阅读