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
易变以使更改对其他线程可见,这可能会从线程池中重新使用。
我看到了this oracle tutorial and also the javadoc on AtomicBoolean。
但是后者 uses volatile 也是。我只在一个线程中设置一次值,所以我不需要 AtomicBoolean 提供的锁定机制。
我只想在变量更新后立即让所有线程看到更改。
据我对oracle教程的理解,更新操作是atomic,即设置值时没有其他线程可以拦截。问题是,何时 将更新的值填充到其他线程(如果有的话?)。
简短的回答是肯定的,你必须让它变得易变。
尽管该操作是原子操作,但要保证它对其他线程可见,您需要建立先发生后关系。 Volatile 是最简单的方法。
假设以下代码
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
易变以使更改对其他线程可见,这可能会从线程池中重新使用。
我看到了this oracle tutorial and also the javadoc on AtomicBoolean。 但是后者 uses volatile 也是。我只在一个线程中设置一次值,所以我不需要 AtomicBoolean 提供的锁定机制。 我只想在变量更新后立即让所有线程看到更改。
据我对oracle教程的理解,更新操作是atomic,即设置值时没有其他线程可以拦截。问题是,何时 将更新的值填充到其他线程(如果有的话?)。
简短的回答是肯定的,你必须让它变得易变。
尽管该操作是原子操作,但要保证它对其他线程可见,您需要建立先发生后关系。 Volatile 是最简单的方法。