[英]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.