不安全:storeFence() 和 loadFence() 与 volatile

Unsafe: storeFence() & loadFence() vs volatile

我正在检查 this great post 上的 java 栅栏,其中栅栏用于以下示例,以确保并发线程始终可以读取从其他线程更新的最新值:

// CPU 0:
void shutDownWithFailure(void)
{
  failure = 1; // must use SOB as this is owned by CPU 1
  SFENCE // next instruction will execute after all SOBs are processed
  shutdown = 1; // can execute immediately as it is owned be CPU 0
}
// CPU1:
void workLoop(void)
{
  while (shutdown == 0) { ... }
  LFENCE // next instruction will execute after all LOBs are processed
  if (failure) { ...}
}

我的问题是,针对 volatile 使用栅栏有什么好处。
以上面的例子为例,如果我让 failureshutdown volatile,它应该达到同样的效果吗?

我会说,所有内容都在与该问题相关的 JEP 171 顶部的“动机”部分中进行了描述。总结一下:它旨在提供一种记录的方式来访问这些机制,并为并发访问提供 类 的进一步实现和扩展。

并不意味着使用它们总是优于 volatile