缓存一致性协议 mesi

时间:2021-12-27 08:36:07

m : modified

e : exlusive

s : shared

i : invalid

四种状态的转换略过,现在讨论为什么有了这个协议,i++在多线程上还不是安全的。

两个cpu A B同时执行 i++ 的操作,假设i初始值为0

A 读入i ,缓存行状态为 e

B读入i , 发现A有,那么设置为s,A里面也设置为s

A cpu处理,i值加一等于一,但是只是在寄存器中,没写入缓存 此时状态还是S

B cpu处理,i值加一等于一,同上,还是S

A写入缓存,i 值为1 , 缓存行状态为M,此时B的缓存行状态为I(无效)

B cpu写入的时候,发现缓存行无效,需要从内存读取,此时发现A的缓存行中有且为M状态,那么要求A刷新入内存,此时内存的i为1,A的缓存行为E,B读入自己的缓存(还是从A那里获取?),此时AB的缓存行都为S,i值都为1

B cpu写入,注意,此时是把1,赋值给1,B的状态为M,A为I(以后略)

这样就看出来了,缓存一致性协议是保证不了 内存的一致性的。

既然有缓存一致性了,为什么还要有 volatile?

JVM的工作内存,应该还包括了内存中的一部分,所以仅仅依靠缓存一致性,不能保证工作内存的变量在线程之间可见