前言
Java内存模型完全可以参考Java内存结构,两者都是一种规范。为了帮助虚拟机实现某种功能,后者是为了帮助更好的垃圾回收,而前者则是为了帮助程序员屏蔽一些底层的如操作系统和内存访问的差异。就是为了简化多线程在Java中的编写。jvm虚拟机会实现该规范,让程序员更好的编写多线程代码
0x01 基础知识
TPS(Transactions Per Second):每秒服务端平均能响应的请求总数
缓存一致性:每个处理器都有自己的高速缓存,又共享同一主内存。当多个处理器处理都涉及到同一块主内存区域时,可能导致各自的缓存不一致
内存模型:在特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象,不同架构的物理机器可以拥有不一样的内存模型。
0x02 硬件层面
解决处理器优化和指令重排
处理器和编译器都会对代码进行重排序,从而导致内存可见性问题
解决方法:jmm通过插入内存屏障来禁止特定类型的处理器重排序
解决缓存一致性
由于CPU处理速度过快,导致内存跟不上。因此引入了高速缓存
,虽然解决了一些矛盾,但是引入了缓存一致性
问题。可以通过各个处理器访问缓存时都遵循一些协议,在读写时要根据协议来进行操作,这类协议有MSI
,MESI
,MOSI
,Synapse
,Firefly
,Dragon Protocol
等
解决方法:cpu通过lock
指令使其他缓存失效
0x03 并发
其实Java内存模型就是围绕着并发过程中如何处理原子性
,可见性
,有序性
来建立的
0xFF 总结
简单的说,Java内存模型保证了Java的并发内存访问操作不会产生歧义。
0xPS1 参考
一些基础原因请参考此系列文章,非常详细