如果一个方法检查(独立)A 然后作用于 B,它是否包含竞争条件?

Does a method contain a race condition if it checks (independent) A and then acts on B?

考虑以下 class:

public class CheckThenAct
{
    private volatile boolean flag = false;
    public void setFlag(boolean flag) { this.flag = flag; }
    public boolean getFlag() { return flag; }

    private final Map<String, String> map = new ConcurrentHashMap<>();
    public void removeIfFlag(String x)
    {
        if (flag)
            map.remove(x);
    }
}

removeIfFlag(String) 是否包含竞争条件?

到目前为止,我读过的唯一示例具有以某种方式彼此相关的条件和写入(例如检查和写入同一集合对象)- 在这种情况下,这两个字段之间没有约束而且它们不是同一个对象。

假设您有一个调用 setFlag(true) 的线程和另一个调用 removeIfFlag.

的线程

如果只有机会决定哪个线程将首先到达标志(即,如果线程不是 synchronized/coordinated/interlocked/whatever-you-may-call-it),那么这就是数据竞争。

如果程序的输出取决于哪个线程赢得竞争,那么这就是竞争条件

如果您的程序的正确性 取决于哪个线程赢得比赛,那就是一个错误。