执行递增线程后,变量始终相同

时间:2019-05-06 21:20:03

标签: java multithreading

我正在尝试了解线程。 我写了简单的程序。

public class Main {
    static int counter = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter++;
            }
        });
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter++;
            }
        });

        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(counter);
    }
}

结果始终为2000,但我不知道为什么。任何运行方法都不同步,因此为什么它总是给我相同的结果。

如果我写:

 t1.start();
        t1.join();
        System.out.println(counter);
        t2.start();
        System.out.println(counter);

然后我得到结果:1000,1000。为什么总是等于1000?

2 个答案:

答案 0 :(得分:7)

循环太短了,t1t2开始之前就结束了。尝试100,000。缺少同步并不能保证您会遇到并发问题,但是正确地合并同步可以防止这些问题。

答案 1 :(得分:5)

  

结果总是2000,但是我不知道为什么。

因为您很幸运在两个线程之间没有任何竞争状况。仅仅因为发生种族状况 并不意味着就可以保证发生

  

为什么总是等于1000?

因为第二次打印计数器时第二个线程尚未执行。或者是因为它已经执行,但是由于缺乏同步而没有可见性保证,因此主线程仍然可以看到最新值。