java虚拟机规范中定义了Java内存模型(java Memory Model,JMM),用来屏蔽掉各种硬件和操作系统访问内存的差异(内存访问差异),来实现java程序在各种平台下都能达到一致的并发效果

  JMM规范了java虚拟机(JVM)与计算机内存如何协同工作:规定一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。

终于有人把Java内存模型说清楚了!(da大牛)

摘自:   https://www.cnblogs.com/ncy1/articles/9380046.html

 

大牛有话说:

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

 

问题:

1.用来屏蔽硬件和操作系统访问内存的差异是什么?(我最开始的理解:是以为以JMM的规范来处理操作系统访问处理内存的一种标准,但是这样的话,本身硬件和操作系统访问内存就存有误差性,再以JMM规范的话,那不是误差更大了)?

然鹅:java线程之间的通信由java内存模型控制,即每个线程的工作内存(本地内存) 都要经过主内存然后再传递到其他线程。各个线程单独工作的同时,又有公共变量作为所有线程互相通信的标准。

这里,本地内存又是JMM一个抽象的概念,不是真实存在的。涵盖了缓存,写缓冲区(?),寄存器以及其他的硬件和编译器优化。那就可以解释,为什么是可以解决硬件和操作系统访问内存的差异,因为它解决了 缓存一致性(可见性)、处理器优化(原子性)和指令重排(有序性)的问题。

 自问:JMM怎么可以存在这么多地方,怎么做到的?