Java

时间:2018-06-21 09:20:02

标签: java multithreading race-condition

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();

我不知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

实际上,种族条件是不确定的状态。通常,很难复制它,尤其是-在您的示例中,因为您使用非常快速且简单的资源进行并发。而且您对线程初始化顺序的更改与Java语言的POV没什么不同。

所以没有人知道您的更改为什么会产生这种效果。它可能取决于您的操作系统,硬件,JVM版本,编译器版本,JVM配置,编译器的优化器配置,甚至取决于当前的处理器负载。