Java 中的惰性布尔关闭标志是否需要 volatile?

Is volatile needed for a lazy boolean shutdown flag in Java?

假设以下代码

public class Singleton {

  boolean shuttingDown = false;


  void action() {
    if (shuttingDown) {
      throw new RuntimeException("already shutting down");
    } 
    // do some more stuff
  }

  // Called by a single thread only
  void onShutDown() {
    shuttingDown = true;
    // perform some more actions to remedy the class
  }
}

基本上我想阻止所有即将到来的对 action() 的调用,但有一个例外。 我知道设置 shuttingDown 是一个原子操作。然而,问题是我是否需要使 shuttingDown 易变以使更改对其他线程可见,这可能会从线程池中重新使用。

我看到了this oracle tutorial and also the javadoc on AtomicBoolean。 但是后者 uses volatile 也是。我只在一个线程中设置一次值,所以我不需要 AtomicBoolean 提供的锁定机制。 我只想在变量更新后立即让所有线程看到更改。

据我对oracle教程的理解,更新操作是atomic,即设置值时没有其他线程可以拦截。问题是,何时 将更新的值填充到其他线程(如果有的话?)。

简短的回答是肯定的,你必须让它变得易变。

尽管该操作是原子操作,但要保证它对其他线程可见,您需要建立先发生后关系。 Volatile 是最简单的方法。