定义:
Java内存模型是用来定义变量的访问规则。即在虚拟机中将变量存储到内存和从内存中取出变量的底层细节。
简而言之,Java内存模型是对特定内存的读写访问的过程抽象。
——《深入理解Java虚拟机》
变量And特定内存?
1.这里的变量和Java语言中的变量不相同。
这里的变量指:实例字段,静态字段和构成数组对象的元素。
在《Java并发编程的艺术》中将这些变量称为共享变量。
不包括:局部变量,方法参数,异常处理器参数。
我们在学习Java虚拟机内存区域时了解到:
对象实例和数组存放在堆区;
静态字段存放在方法区;
而这两个区域有一个共同的特点就是线程共享的。而局部变量,方法参数,异常处理器参数都是存放在局部方法栈。而这部分是线程私有的。
【注意】:如果局部变量是一个引用类型,那么引用本身是线程私有的,而引用所指向的对象是线程共享。
2.这里的特定内存也就是上述提到的变量的存储的地方,我们称之为主内存。同时,每条线程还有自己的工作内存,这里保存了该线程使用到的变量的主内存副本拷贝。
(1)线程对变量的所有操作只能在自己的工作内存中进行,而不能直接读写主内存;
(2)不同线程之间无法直接访问对方工作内存中的变量
(3)线程间变量值的传递需要通过主内存来完成。
(下图显示线程间变量值传递必须通过主内存来完成)
步骤1:即线程A把更新过的共享变量刷新到主内存中区。
步骤2:线程B到主内存中去读取A之前已经更新过的共享变量。
Java内存模型和Java内存区域的关系
1.是按不同角度对内存进行划分;
2.主内存和工作内存都是虚拟机内存的一部分;
2.暂且可以把主内存和堆对应起来;工作内存和虚拟机栈的一部分对应起来。
(下图中可以看到方法区和堆是线程共享区域)
Java内存模型和硬件中的内存
Java中线程、工作内存、主内存的关系与计算机硬件中的处理器、高速缓存和内存的关系很类似。
内存模型中的主内存一般存储在硬件中的内存。
而工作内存一般存储与寄存器和高速缓存。
作用
1.保证并发程序的正确性
2.能够提高并发程序的执行速度(存储于寄存器和高速缓存中的工作内存访问速度快)
3.Java内存模型(JMM)屏蔽掉各种硬件和操作系统的内存访问差异,以实现Java程序在各种平台下都能达到一致的内存访问效果。