此时线程 2 的高速缓存当中 i 的值还是 0 ,进行加 1 操作之后,i 的值为 1,然
后线程 2 把 i 的值写入内存。
最终结果 i 的值是 1 ,而不是 2 。这就是著名的 缓存一致性问题
一、计算机内存模型
如下图所示
每个 CPU 都有自己的高速缓存(寄存器),而它们又共享同一主存(Main
Memory)。当多个 CPU 的运算任务都涉及到同一变量时,在每个 CPU 对应的
高速缓存都会缓存一份该变量的值,那同步回主存时以谁的为准呢?
为了解决一致性的问题所以,就出现了缓存一致性协议 ,其中最出名的就是
Intel 的 MESI 协议。MESI 协议保证了每个缓存中使用的共享变量的副本是一
致的。它核心的思想是: 当 CPU 写数据时,如果发现操作的变量是共享变量,
即在其他 CPU 中也存在该变量的副本,会发出信号通知其他 CPU 将该变量的
缓存行置为无效状态。因此,当其他 CPU 需要读取这个变量时,发现自己缓
存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。
二. Java 内存模型
在 Java 虚拟机规范 中,试图定义一种 Java 内存模型(Java
Memory Model,JMM)
来屏蔽各个硬件平台和操作系统的内存访问差异,以实现让 Java
程序在各种平台下都能达到一致的内存访问效果。
评论0
最新资源