Java内存模型(Java Memory Model ,JMM)

  • JAVA内存模型是JAVA虚拟机用来屏蔽 硬件和操作系统内存 读取差异,以达到各个平台下都能达到一致的内存访问效果。
  • Java内存模型的主要目的是定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到内存和从内存中取出变量值这样的底层细节。
  • java内存模型符合计算机内存模型规范的。注意java内存模型也是一种规范,具体怎么实现规范还是要靠程序员。

总结:java内存模型是符合计算机内存模型规范的一种 保证内存中共享变量 一致性、可见性、有序性的规范。
java内存模型的由来是因为计算机内存模型是和硬件直接打交道的,计算机内存模型的规范在不同硬件中有不同的实现方式,而java内存模型屏蔽了这些差异。
那么计算机内存模型的由来是因为缓存一致性问题。

JMM由来

要从计算机硬件cpu和内存说起,我们知道cpu完成一次计算要把数据从内存中加载到寄存器,但是cpu的计算单元alu访问寄存器的速度是访问内存的100倍左右,
为了充分利用cpu的计算能力吗,在cpu和内存中间引入缓存的概念。将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存,
这样cpu就无须等待缓慢的内存读写了。

基于高速缓存的存储交互很好地解决了处理器与内存的速度矛盾,但是也为计算机系统带来更高的复杂度,
因为它引入了一个新的问题:缓存一致性(CacheCoherence)。

为了解决缓存一致性问题,出现了计算机的内存模型,英文名Memory Model。他是与计算机硬件有关的一个概念。
为了保证共享内存的正确性(可见性、有序性、原子性)的一种规范。

由于上面的所说的都是和硬件相关,不同的硬件对内存模型规范的实现并不一样,有的可能是锁总线,有的可能是通过缓存一致性协议。
对于java语言来说为了能够屏蔽硬件层的差异,诞生了java内存模型,java内存模型规范是符合计算机内存模型规范的。

Java内存模型(JavaMemoryModel)描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量,
存储到内存和从内存中读取变量这样的底层细节。

Java 内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存。
线程的工作内存中保存了该线程中用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。
不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。
而 JMM 就作用于工作内存和主存之间数据同步过程。它规定了如何做数据同步以及什么时候做数据同步。

缓存一致性概念理解

缓存一致性问题。在多路处理器系统中,每个处理器都有自己的高速缓存,而它们又共享同一主内存,
当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致。

参考文档

终于有人把Java内存模型说清楚了!

计算机内存模型

阿里面试官没想到,一个Volatile我能跟他扯半个小时

posted on 2022-03-12 12:08  哑吧  阅读(70)  评论(0编辑  收藏  举报