刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!
由于主存与 CPU 处理器的运算能力之间有数量级的差距,所以在传统计算机内存架构中会引入高速缓存来作为主存和处理器之间的缓冲,CPU 将常用的数据放在高速缓存中,运算结束后 CPU 再讲运算结果同步到主存中。
使用高速缓存解决了 CPU 和主存速率不匹配的问题,但同时又引入另外一个新问题:缓存一致性问题。
在多CPU的系统中(或者单CPU多核的系统),每个CPU内核都有自己的高速缓存,它们共享同一主内存(Main Memory)。当多个CPU的运算任务都涉及同一块主内存区域时,CPU 会将数据读取到缓存中进行运算,这可能会导致各自的缓存数据不一致。

编译器在编译的时候,允许重排序指令以优化运行速度。CPU在执行指令的时候,为了使处理器内部运算单元能被充分利用,也可以对指令进行乱序执行。
在编译器和CPU进行重排序的时候,要遵循“as-if-serial”原则,也就是要保证程序单线程执行的时候,重排序之后程序的运行结果必须和重排序前程序的运行结果一致。这里注意“as-if-serial”原则只保证单线程的执行结果不变,不保证多线程执行的结果不变。那么如何保证多线程程序的正确运行?显然需要某种协议来限定多线程执行时要满足的规则。
要解决缓存一致性问题需要某种协议,要解决重排序问题也需要某种协议。于是java定义了一种协议,一揽子解决了这两个问题,这个协议就是Java内存模型(JMM)。


为了更精准控制工作内存和主内存间的交互,JMM 还定义了八种操作:lock, unlock, read, load,use,assign, store, write。
JMM 的主要概念是:
本文链接:JMM解决缓存一致性&重排序问题
版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!
