缓存一致性协议是Java内存模型中的一种协议,具体如图所示:
缓存一致性协议分为四种状态:
- Modified(修改):数据有效,数据被修改了,和内存中数据不一致,数据只存在于本Cache中。
- Exclusive(独享):数据有效,数据和内存中的数据一致,数据只存在于本Cache中。
- Shared(共享):数据有效,数据和内存中的数据一致,数据存在多个Cache中。
- Invalid(无效):数据无效,一旦数据被标记为无效,那效果就等同于它从来没被加载到缓存中。
缓存一致性协议工作流程/原理:
- CPU a从缓存中读取了缓存行a,其他CPU都没有读,这时这条缓存行的状态为
Exclusive(独享)
状态。 - 这时CPU b也从缓存中读取了缓存行a,这时这条缓存行的状态为
Shared(共享)
状态。 - 当CPU a修改了缓存行a,并从回写到缓存中,这时这条缓存行的状态为
Modified(修改)
状态,然后会回写到主存中去。 - 每个CPU读取完缓存行之后都在内存中监听已读缓存行的状态,这时CPU b就会监听的缓存行a已被修改,此时,CPU b就会把他设置为
Invalid(无效)
状态,无效状态的数据会被丢弃,如果想继续操作的话,还需要到主存中重新获取。 - 最后,这条缓存行a在CPU a中的状态又会改为
Exclusive(独享)
状态。
关于Java的内存模型可以看这篇文章:https://blog.csdn.net/xianyun1992/article/details/107723694
如果N个CPU同一时间要去修改同一份缓存行会怎样?
这里会有一个裁决机制,系统自动裁决。
什么是缓存行?
最小存储单元,根据CPU品牌不同,有可能是32字节、64字节或者128字节。