java 并发基础-JMM介绍

161 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

内存模型JMM

471-20220411171549645.png

为什么是这种结构

由于CPU的速度快,内存的速度慢。因此CPU需要建立缓存机制来平衡内存的速度。

内存模型的三大特性

可见性

原子性

有序性(指令重排)

缓存一致性原理

缓存锁通过MESI实现缓存一致性,MESI通过内存屏障保证指令的前后顺序

当LOCK修改变量写回主存时,需要发送失效的消息给其他CPU,然后等待确认回执.这期间通过等待来保证指令的前后顺序.

通过内存屏障从底层来实现指令前后顺序.

缓存一致性原则在遇到LOCK指令(volatile)时会实现强制一致性

基本介绍

所有内存的传输都发生在一条共享的总线上.

总线锁定:早期的CPU中,碰到LOCK指令,会锁住总线,即当一个CPU操作时,其他CPU都阻塞,该CPU独享主存,但是开销太大

缓存锁定:现代的CPU采用缓存锁定方式。

MESI是代表了缓存数据的四种状态的首字母,分别是

  • Modified :被修改的 。 只在本CPU中有缓存,并且被修改
  • Exclusive:独享的 。 只在本CPU中有缓存,但是没有修改,与主存一致
  • Shared: 共享的 。 在多个CPU缓存中都存在且与主存一致
  • Invalid: 失效 。 要么CPU缓存中不存在,要么已经过时

嗅探机制

CPU会不停嗅探在总线上的数据交换,当一个缓存代表CPU去读取或者写入主存时,其他CPU都会知道

对上面四种状态的修改会被嗅探到并进行处理。

  • 处于Modified状态时,如果有其他CPU想要读取该值。在此操作前将其缓存写回主存中,并将其他CPU的缓存置为I
  • 处于Exclusive状态时,其他CPU读取该值,把缓存行状态设置为Shared
  • 处于Shared状态时,当有其他CPU修改了该值(它的状态变成了M),将自己的缓存设置为Invalid