假设以下代码
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
volatile变为对其他线程可见,这可能会从线程池中重用。
我看到了this oracle tutorial以及AtomicBoolean上的javadoc。 然而后者uses volatile也是如此。我在单个线程中只设置了一次值,因此我不需要AtomicBoolean提供的锁定机制。 我只想在变量更新后立即对所有线程进行更改。
据我所知oracle教程,更新操作是 atomic ,这是其他线程在设置值时无法接受的。问题是,何时将更新的值填充到其他线程(如果有的话)。
答案 0 :(得分:6)
简短的回答是肯定的,你必须让它变得不稳定。
虽然操作是原子操作,但为了保证其他线程可见,您需要在关系之前建立一个发生。易失性是最简单的方法。