JMM模型涉及到的内容还是很多的,总是不理解它的这个循序渐进的过程,还是记录一下。一、JMM模型是什么?
Java Memory Model:java内存模型。JMM模型就是Java自己的一套协议,用来屏蔽不同硬件和操作系统之间的内存访问逻辑的差异,实现平台一致性,到达最终的“一次编写,到处运行”。实际上,它就是一种抽象概念,是JVM在计算机内存中的工作方式,规范了JVM如何与计算机内存进行交互。JMM模型定义了线程和主内存之间的关系。
二、计算机的硬件结构在引出JMM模型之前,需要先介绍一下计算机的硬件结构,因为JMM模型实际上是一种抽象的概念,并不是真实的,其中的工作内存实际上指的是寄存器和CPU 缓存等这些东西,它是屏蔽了这些差异。那么硬件结构如下图所示。
这也就是说,CPU并不能直接对内存中的数据进行计算。因为CPU和内存的处理速度差距很大,所以主存读取数据后,先放在了CPU缓存中,当这些数据需要也CPU进行交互的时候,在将其加入到寄存器中,最后被CPU使用。
二、JMM模型图JMM模型定义了线程和主内存之间的关系,线程之间的共享变量存放在主内存中,每个线程都有私有的本地内存,本地内存中储存了共享变量的副本。
图中涉及到的工作内存和主内存的概念
主内存:主要存放的Java中的实例对象,还有常量,类信息,静态变量这些共享数据。
工作内存:线程私有,主要存放当前方法的所有本地变量信息,也就是线程的私有数据,其他线程访问不到。
三、JMM涉及到的并发问题 .线程之间的通信在编程中,线程通信机制有两种:共享内存和消息传递。
共享内存:
线程之间共享程序的公共状态,线程之间通过写-读来操作内存中的公共状态,从而进行隐式的通信,典型的共享内存通信方式就是通过共享对象进行通信。
消息传递:
在消息传递的并发模型中,线程之间没有公共状态,它们必须通过明确的发送消息来显式通信,在Java中典型的消息传递的方式:wait()和notify()
线程间的同步:
在内存并发模型中,同步是显式的,意为:控制不同线程之间操作发生的相对顺序。必须是指定哪个方法或者代码块在线程之间互斥执行。
在消息传递的并发模型中,由于消息的发送必须在消息的接受之前的,所以同步是隐式的。
四、JMM缓存不一致问题既然涉及到了多线程,肯定就会有这类问题,那么主要有两种解决方案。
1.总线加锁
也就是说当线程从主内存中读取数据时,会先在总线对数据进行加锁,使用完释放,其他线程才能读或者写。
2.MESI缓存一致性协议
就是如果某个线程在其工作内存中修改了共享变量的数据值,那么其他线程通过总线嗅探机制感知到数据的变化,从而使自己缓存的数据失效。
五、内存交互操作流程图


