使用volatile'status flag'布尔值的java同步?
我已经了解了volatile
用法的“状态标志”模式。
它说,如果状态标志不依赖于任何其他状态,我可以在不进行任何同步的情况下使用volatile
。它将保证标志对其他线程的可见性。此外,对布尔值的写入是原子的
但是在与other相关的问题中,有人说当只有一个线程可以修改标志时,使用volotile
是安全的。否则,我需要使用任何同步或AtomicBoolean
在我的示例中,我有stopped
标志,但它可以在一个线程内进行多次修改:方法stop()
和continue()
。{stop()
在continue()
方法之后调用stop()
时可以不工作,那么代码是线程安全的吗
class MyClass {
private volatile boolean stopped;
public void doWork() {
while(!stopped) {
doSmth();
}
}
public void stop() {
stopped = true;
}
public void continue() {
stopped = false;
}
}
至于我,应该是这样。如果我错了,你能澄清一下吗
# 1 楼答案
volatile
只是确保变量的更改对所有线程都可用背景:线程可以制作共享变量的本地副本。将这些局部变量的值与全局共享变量同步是
volatile
的效果但是,在单个条目、监视器/关键区域的java环境中,这不会同步
整个
java.util.concurrent
工具箱提供了一些功能,比如确保只有一个线程可以更改值等等。如果你想从头开始,你可以用两个变量做一些阻塞的事情:搜索Dijkstra算法在这里,我认为^{} 对于非阻塞使用可能很好
如果您想要实现一个全局布尔状态,该状态将暂停在切换(你的
stopped
)时恢复线程,而不是一些丑陋的忙碌等待:使用全局^{} 并不是最好的API,因为它与N个预定义的
Runnable
一起工作