date created | date modified |
---|---|
2022-05-27, 15:28:03 |
2022-06-20, 10:58:59 |
- alias:
- parent :: [[MOC JVM]]
- siblings :: [[volatile]],[[final 关键字]]
- child ::
- refs:
强推 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 功能。