gpt4 book ai didi

java - 与 volatile 'status flag' boolean 值同步?

转载 作者:行者123 更新时间:2023-12-02 01:25:49 24 4
gpt4 key购买 nike

我已经阅读了有关 volatile 用法的“状态标志”模式。它表示,如果状态标志不依赖于任何其他状态,我可以使用 volatile 而无需任何同步。它将保证其他线程的标志的可见性。此外,写入 boolean 值是原子的。

但是在 other相关问题据说,当只有一个线程可以修改标志时,使用 volotile 是安全的。否则,我需要使用任何同步或 AtomicBoolean

在我的示例中,我有 stopped 标志,但它可以在一个线程内进行多次修改:方法 stop()continue() doSmth() 不会更新任何状态。如果假设在 continue() 方法之后调用 stop() 时可以不做任何工作,那么代码是线程安全的吗?

class MyClass {
private volatile boolean stopped;

public void doWork() {
while(!stopped) {
doSmth();
}
}

public void stop() {
stopped = true;
}

public void continue() {
stopped = false;
}
}

对于我来说,应该是这样。如果我错了,你能澄清一下吗?

最佳答案

volatile 只是确保对变量的更改可供所有线程使用。

背景:线程可以制作共享变量的本地副本。将这些局部变量的值与全局共享变量同步是 volatile 的作用。

但是,在单个条目、监视器/关键区域的 Java 意义上,这并不同步

java.util.concurrent 的整个工具箱提供了诸如确保只有一个线程可以更改值等功能。如果您想从头开始,可以使用两个变量做一些阻塞性的事情:搜索Dijkstra算法

这里我想AtomicBoolean对于非阻塞使用来说可能很好。

<小时/>

如果您想实现一个暂停的全局 boolean 状态。切换时恢复线程(您的停止),而不是一些丑陋的忙等待:

public void run () {
while (true) {
doWork();
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException ex) {
return;
}
}
}

使用全局 CyclicBarrier - 不是最好的 API,因为它与 N 个预定义的 Runnable 一起使用。

关于java - 与 volatile 'status flag' boolean 值同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56966858/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com