JMM 内存模型
什么是JMM
JMM即为JAVA 内存模型(java memory model)。因为在不同的硬件生产商和不同的操作系统下,内存的访问逻辑有一定的差异,结果就是当你的代码在某个系统环境下运行良好,并且线程安全,但是换了个系统就出现各种问题。Java内存模型,就是为了屏蔽系统和硬件的差异,让一套代码在不同平台下能到达相同的访问结果。
内存划分
JMM规定了内存主要划分为主内存和工作内存两种。
主内存对应的是硬件的物理内存,工作内存对应的是寄存器和高速缓存。
数据从硬件读取加载的主内存,CPU处理数据通过主内存读取,计算等。
多核并发缓存结构图
cpu三级缓存图
JMM内存模型
java线程内存模型跟cpu缓存模型类型,是基于cpu缓存模型来建立的,java线程内存模型是标准化的,屏蔽了底层不同计算机的区别
JMM数据原子操作:
read(读取):从主内存读取数据
load(载入):将主内存读取到的数据写入工作内存
use(使用):从工作内存读取数据来计算
assign(赋值):将计算好的值重新赋值到工作内存中
store(存储):将工作内存数据写入主内存
write(写入):将store过去的变量赋值给主内存中的变量
lock(锁定)将主内存变量加锁,标识为线程独占状态
unlock(解锁):将主内存变量解锁,解锁后其他线程可以锁定改变量
JMM为何会出现缓存不一致问题?
数据从硬盘加载到主内存,cpu读取数据到自己缓存中(CPU处理快,内存处理慢,所以cpu要通过三级缓存机制缓存数据提高速度)CPU将主内存的数据保存副本到自己缓存中,由于现在CPU都是多核,所以每个线程的都保存了副本在自己缓存中,当线程A修改变量时,数据还没有同步到主内存,而其他线程获取到的数据就是旧数据,就会出现数据不一致性。
JMM缓存不一致问题解决方法
1)总线加锁(性能太低)
cpu从主内存读取数据到高速缓存,会在总线对这个数据加锁,这样其他cpu没法去读取或写入这个数据,直到这个cpu使用完数据释放之后其他cpu才能读取该数据
2)MESI缓存一致性协议
多个线程从主内存读取同一个数据到各自的高速缓存中,当其中某个线程修改了缓存里的数据,该数据会马上同步回主内存,其他线程通过总线嗅探机制可以感知到数据的变化从而将自己缓存里的数据失效