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

时间:2015-02-03 16:39:40

标签: java multithreading concurrency

假设以下代码

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 volatile变为对其他线程可见,这可能会从线程池中重用。

我看到了this oracle tutorial以及AtomicBoolean上的javadoc。 然而后者uses volatile也是如此。我在单个线程中只设置了一次值,因此我不需要AtomicBoolean提供的锁定机制。 我只想在变量更新后立即对所有线程进行更改。

据我所知oracle教程,更新操作是 atomic ,这是其他线程在设置值时无法接受的。问题是,何时将更新的值填充到其他线程(如果有的话)。

1 个答案:

答案 0 :(得分:6)

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

虽然操作是原子操作,但为了保证其他线程可见,您需要在关系之前建立一个发生。易失性是最简单的方法。