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

Java中惰性布尔关闭标志是否需要volatile?,java,multithreading,concurrency,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 o

假设以下代码

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

我看到了,还有上面的javadoc。 然而,后者也是如此。我在一个线程中只设置一次该值,因此不需要AtomicBoolean提供的锁定机制。 我只想在变量更新后,使更改对所有线程可见


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

简短的回答是肯定的,您必须使其不稳定


尽管该操作是原子的,但为了保证它对其他线程可见,您需要建立一个“先发生后发生”关系。Volatile是实现这一点的最简单方法。

简单的答案是肯定的,您必须使其具有易失性


尽管该操作是原子的,但为了保证它对其他线程可见,您需要建立一个“先发生后发生”关系。Volatile是实现这一点的最简单方法。

出于性能原因,有没有办法避免使用Volatile?它实际上是一个web应用程序,
action()
方法在每个请求中访问一次。@user3001,任何提供与
volatile
相同可见性保证的方法都将与
volatile
@user3001具有相同的性能损失。最好的方法是不要使用单例:-)。volatile是否真的会导致性能问题?您测量过吗?@user3001您可能可以利用请求调用逻辑中已经存在的其他同步。但这可能不值得麻烦。这是非常非常便宜的。有没有任何方法可以避免出于性能原因使用volatile?它实际上是一个web应用程序,
action()
方法在每个请求中访问一次。@user3001,任何提供与
volatile
相同可见性保证的方法都将与
volatile
@user3001具有相同的性能损失。最好的方法是不要使用单例:-)。volatile是否真的会导致性能问题?您测量过吗?@user3001您可能可以利用请求调用逻辑中已经存在的其他同步。但这可能不值得麻烦。这非常非常便宜。使用
Thread.interrupt()
向线程发送信号怎么样?我不知道线程检查自己的
interrupted
标志的成本是否低于检查可变变量的成本,但这可能值得研究。使用
thread.interrupt()
向线程发送信号怎么样?我不知道一个线程检查自己的
interrupted
标志的成本是否比检查一个可变变量的成本低,但也许值得研究一下。