我已经阅读了有关使用的“状态标志”模式volatile
。它说volatile
如果状态标志不依赖于任何其他状态,我可以在没有任何同步的情况下使用。它将保证标志对其他线程的可见性。此外,写入布尔值是原子的。
但是在另一个相关问题中,据说volotile
只有一个线程可以修改标志时使用是安全的。否则,我需要使用任何同步或AtomicBoolean
.
在我的示例中,我有stopped
标志,但它可以在不止一个线程内进行修改:方法stop()
和continue()
. doSmth()
不更新任何状态。stop()
如果假设在方法之后立即调用时不做工作是continue()
可以的,那么代码是线程安全的吗?
class MyClass {
private volatile boolean stopped;
public void doWork() {
while(!stopped) {
doSmth();
}
}
public void stop() {
stopped = true;
}
public void continue() {
stopped = false;
}
}
至于我,应该。如果我错了,你能澄清一下吗?