【发布时间】:2019-11-19 20:29:44
【问题描述】:
我已经阅读了volatile 用法的“状态标志”模式。
它说如果状态标志不依赖于任何其他状态,我可以在没有任何同步的情况下使用volatile。它将保证标志对其他线程的可见性。此外,写入布尔值是原子的。
但是在other相关问题中,据说只有一个线程可以修改标志时使用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;
}
}
对我来说,它应该。如果我错了,你能澄清一下吗?
【问题讨论】:
-
你没有使用 volatile。没有人知道
doSmth是什么。如果您只有一个布尔变量“停止”,请确保它是线程安全的。 -
代码看起来不错。你在哪里读到
volatile不适用于这个用例?您链接的线程上接受的答案完全将您的场景作为volatile的良好用途。 -
你是对的,我错过了示例中的 volatile 修饰符。 doSmth() 只是做一些与标志无关的事情。我已经更新了描述。
-
@matt,您写道:如果您只有一个布尔变量“停止”,请确保它是线程安全的。非易失性布尔值不能保证其他线程的可见性,我可以在 doWork() 中有无限循环。我相信它不可能是线程安全的。
-
@Thilo,我已经更新了答案的链接。据我了解,如果我们从 > 1 个线程进行修改,它可能不是线程安全的。另外,这不是我的陈述,如果我理解正确,这更像是一个问题。
标签: java multithreading atomicboolean