Java内存模型(JMM)

本文简单介绍一下Java内存模型

一、主内存与工作内存

二、内存间的交互操作

一、主内存与工作内存

1、Java的内存模型(Java Memory Model,JMM)

      java虚拟机规范中尝试用一种Java内存模型来屏蔽掉各种硬件与操作系统的内存访问差异,以实现java程序在各种平台上都能达到一致的并发效果。

2、主内存与工作内存

1>Java内存模型主要目的

     定义程序中各个变量的访问规则,即虚拟机中将变量存储到内存和从内存中取出的底层细节。

     上述变量与Java程序中的变量略有区别:该变量包括实例字段,静态字段和构成数组对象的元素,不包括局部变量和方法参数,因为后者为线程私有,不会存在共享。

 2>主内存与工作内存

     ①主内存(Main memory):       

      java内存模型规定:所有的变量都存储在主内存中,此处主内存可与硬件主内存类比,但此处的主内存为jvm的一部分。

     ②工作内存(Working memory):

      《1》可与处理器的高速缓存类比,线程的工作内存保存了该线程使用到的变量在主内存中的副本拷贝,线程对变量的所有读写操作必须在工作内存进行,不能在主内存进行;

      《2》不同线程之间无法访问对方的工作内存中的变量;

      《3》线程间变量值的传递都是通过主内存来完成的;

 

3>不同角度理解主内存与工作内存

(1) 主内存与工作内存与java内存区域中的java堆、栈、方法区并不是同一个层次的内存划分;

(2)如果两种划分方式对应:主内存对应堆中的实例部分,而工作内存对应虚拟机栈的部分区域;

(3)低层次而言:主内存就是硬件内存,获取更快的运算速度,虚拟机的硬件系统可能会让工作内存优先于寄存器与高速缓存。

二、内存间交互操作

       主内存与工作内存的交互协议,即一个变量如何从做内存拷贝到工作内存,以及工作内存中的变量如何同步回主内存的实现细节。

       java内存模型定义8中操作完成:

      (1)lock(锁定):作用于主内存的变量,把一个标量表示为线程独占状态;

      (2)unlock(解锁):作用于主内存的变量,把一个锁定的变量解锁,解锁的变量可以被其他线程锁定;

      (3)read(读取):作用于主内存的变量,将一个变量的值从主内存传输到线程的工作内存,以便随后的load操作;

      (4)load(载入):作用于工作内存,将read操作从主内存读到的变量值放入到工作内存的变量副本中;

      (5)use(使用):作用于工作内存中,将工作内存中的一个变量值传递给执行引擎,每当虚拟机需要一个使用变量值的字节码指令时将会执行该操作;

      (6)assign(赋值):作用于工作内存,将一个从执行引擎收到的值赋值给工作内存变量;

      (7)store(存储):作用于工作内存的变量,将工作内存中的一个值传递到主内存,以便随后的write操作使用;

      (8)write(写入):作用于主内存,将store操作的工作内存的得到的变量的值放入主内存的变量中

猜你喜欢

转载自1498116590.iteye.com/blog/2412453