public class LongWrapper {
private long l;
public LongWrapper(long l){
this.l = l;
}
public long getL() {
return l;
}
public void setL(long l) {
this.l = l;
}
public void incrementValue(){
l = l+1;
}
}
这是我的 RaceCondition 班。
public class RaceCondition {
public static void main(String[] args) throws InterruptedException{
LongWrapper longWrapper = new LongWrapper(0L);
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 1000; i++)
longWrapper.incrementValue();
}
};
Thread t1 = new Thread(runnable);
t1.start();
Thread t2 = new Thread(runnable);
t2.start();
t1.join();
t2.join();
System.out.println(longWrapper.getL());
}
}
我无法确定的是,在此程序中,为什么没有触发竞赛条件。运行该程序时,每次输出精确为2000 。
但是如果我按如下所示更改顺序,则说明竞争条件正在触发,并且输出与预期的不同。
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
t1.join();
t2.join();
我不知道为什么会这样吗?
答案 0 :(得分:0)
实际上,种族条件是不确定的状态。通常,很难复制它,尤其是-在您的示例中,因为您使用非常快速且简单的资源进行并发。而且您对线程初始化顺序的更改与Java语言的POV没什么不同。
所以没有人知道您的更改为什么会产生这种效果。它可能取决于您的操作系统,硬件,JVM版本,编译器版本,JVM配置,编译器的优化器配置,甚至取决于当前的处理器负载。