gpt4 book ai didi

java - 创建可取消线程是否需要 AtomicBoolean?

转载 作者:行者123 更新时间:2023-11-29 03:37:11 26 4
gpt4 key购买 nike

我经常使用以下模式来创建可取消的线程:

public class CounterLoop implements Runnable {

private volatile AtomicBoolean cancelPending = new AtomicBoolean(false);

@Override
public void run() {
while (!cancelPending.get()) {
//count
}
}

public void cancel() {
cancelPending.set(true);
}
}

但我不确定 cancelPending 必须是 AtomicBoolean。在这种情况下,我们可以只使用普通 boolean 值吗?

最佳答案

不需要同时使用 volatileAtomicBoolean。如果将 cancelPending 变量声明为 final,如下所示:

private final AtomicBoolean cancelPending = new AtomicBoolean(false);

final 字段的 JLS 语义意味着不需要同步(或 volatile)。所有线程都将看到 cancelPending 引用的正确值。 JLS 17.5状态:

"An object is considered to be completely initialized when its constructor finishes. A thread that can only see a reference to an object after that object has been completely initialized is guaranteed to see the correctly initialized values for that object's final fields."

...但是普通字段没有这样的保证;即不是 final 也不是 volatile

您也可以将 cancelPending 声明为 volatile boolean ... 因为您似乎没有使用 的测试和设置功能原子 boolean 值

但是,如果您使用了非 volatile boolean,则需要使用synchronized 来确保所有线程都看到 的最新副本>cancelPending 标志。

关于java - 创建可取消线程是否需要 AtomicBoolean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14875189/

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