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