use*_*001 0 java concurrency multithreading
假设以下代码
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
}
}
Run Code Online (Sandbox Code Playgroud)
基本上我想阻止所有即将到来的调用action()
.我知道设置shuttingDown
是原子操作.但是问题是我是否需要使用shuttingDown
volatile来使更改对其他线程可见,这些线程可能会从线程池中重用.
我看到了这个oracle教程以及AtomicBoolean上的javadoc .然而,后者也使用挥发性.我在单个线程中只设置了一次值,所以我不需要AtomicBoolean提供的锁定机制.我只想在变量更新后立即对所有线程进行更改.
据我所知的oracle教程,更新操作是原子的,在设置值时没有其他线程可以接受.问题是,何时将更新的值填充到其他线程(如果有的话?).
简短的回答是肯定的,你必须让它变得不稳定.
虽然操作是原子操作,但为了保证其他线程可见,您需要在关系之前建立一个事件.易失性是最简单的方法.
归档时间: |
|
查看次数: |
344 次 |
最近记录: |