我不懂StoreLoad。
store1 StoreLoad load2是否意味着CPU的store指令不能在StoreLoad之后重新排序并且load指令不能在StoreLoad之前重新排序? 如果是这样的话,是不是意味着load指令可以排序在StoreLoad之后,store指令可以排序在StoreLoad之前?
我也经常与栅栏作斗争。第一的;栅栏不能替代 JMM:https://shipilev.net/blog/2016/close-encounters-of-jmm-kind/#myth-barriers-are-sane。
除了 [LoadLoad][LoadStore][StoreLoad][StoreStore] 顺序保证之外,栅栏可以是 1 路或 2 路。因此,单向栅栏只会在 1 个方向上进行排序,例如,易失性负载只会阻止后来的负载/存储与该读取一起重新排序,但不会阻止早期的负载/存储与该易失性负载一起重新排序。在 Java 中,这称为 roach-motel 语义。
双向围栏将在两个方向上排序装载/存储。例如。 VarHandle.storeStoreFence 将防止栅栏两侧的商店被重新排序。