Skip to content

Latest commit

 

History

History
38 lines (26 loc) · 1.73 KB

内存屏障.md

File metadata and controls

38 lines (26 loc) · 1.73 KB
date created date modified
2022-05-27, 15:28:03
2022-06-20, 10:58:59

Meta


强推 refs 中的两篇文章,可以看出什么是一篇好的技术文!

内存屏障作用:

  • 禁止指令重排
  • 触发 CPU 某些行为保证可见性

硬件层面有 Read Barrier 和 Write Barrier(也是一种抽象模型,而非具体平台实现)。

JVM 层面按前后分别有读、写两种操作以全排列方式一共提供了四种 Barrier:

load 和 store 对应去内存取数和向内存存数,即操作共享变量,注意给局部变量赋值或读取局部变量不是 load 和 store 操作。

  • LoadLoad,操作序列 Load1, LoadLoad, Load2,Load1 必须先于 Load2,不能重排(Load1 必须先于后面所有的 Load 操作
  • LoadStore,操作序列 Load1, LoadStore, Store2
  • StoreLoad,操作序列 Store1, StoreLoad, Load2
  • StoreStore,操作序列 Store1, StoreStore, Store2

4 种 Barrier 是 JVM 为了跨平台设计的(抽象使涵盖大部分的 CPU 架构),具体到某一个 CPU 上,对应的 JVM 实现会根据 CPU 具体特性优化掉一些 Barrier,比如某 CPU 可以保证某些操作的顺序性,那么本该插入 Barrier 的地方会被替换成一个空操作。

x86 平台上的 JVM 实现只用到了 StoreLoad(x86 的特性保证了其他 3 个 Barrier 的成立),使用 lock 前缀指令实现 StoreLoad 功能。