如果一个方法检查(独立)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),那么这就是数据竞争。
如果程序的输出取决于哪个线程赢得竞争,那么这就是竞争条件。
如果您的程序的正确性 取决于哪个线程赢得比赛,那就是一个错误。
考虑以下 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),那么这就是数据竞争。
如果程序的输出取决于哪个线程赢得竞争,那么这就是竞争条件。
如果您的程序的正确性 取决于哪个线程赢得比赛,那就是一个错误。