繁体   English   中英

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变得易失性以使更改对其他线程可见,这些线程可能会从线程池中重新使用。

我看到了这个 oracle 教程AtomicBoolean上的 javadoc。 然而,后者也使用 volatile 我在单个线程中只设置了一次值,所以我不需要 AtomicBoolean 提供的锁定机制。 我只想在变量更新后立即使更改对所有线程可见。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM