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
标志的成本是否比检查一个可变变量的成本低,但也许值得研究一下。