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

pip*_*lam 1 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

如果我写:

 t1.start();
        t1.join();
        System.out.println(counter);
        t2.start();
        System.out.println(counter);
Run Code Online (Sandbox Code Playgroud)

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

WJS*_*WJS 7

您的循环是如此之短,以至于无法t1完成t2。尝试100,000。缺少同步并不能保证您会遇到并发问题,但是正确地合并同步可以防止这些问题。


JB *_*zet 5

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

因为您很幸运在两个线程之间没有任何竞争状况。仅仅因为一个竞争条件可能会发生并不意味着它保证的情况发生。

为什么总是等于1000?

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