我正在学习JSR-133菜谱,页面链接为JSR-133,在“分类”部分,作者给出了一个关于内存屏障的例子。以下是代码:
JSR-133编译器编写指南中的混淆矩阵似乎呈现了实现volatile
语义所需的障碍的优化视图。
volatile
的语义基本上是针对非易失性访问的释放/获取 + 针对易失性访问的总顺序。一般来说,加载-获取需要发出LoadLoad
+ LoadStore
屏障,而存储-释放需要发出LoadStore
+ StoreStore
屏障。为了保留一对volatile
访问的总顺序,可以发出完整的栅栏。
load u
后跟着 load b
和 store a
是一个很好的展示 volatile
语义工作方式的例子。请记住,相对于非 volatile 访问,volatile
加载本质上具有获取语义。这意味着 load u
可能不会与任何后续访问重新排序,因此会发出 LoadLoad
屏障和 LoadStore
屏障。如果没有 LoadStore
,store a
可能会在 load u
之前重新排序,从而破坏 volatile
的语义。
load
和sfore
。 - user207421