gpt4 book ai didi

java - 为什么这里的主线程不等待t2?在这里,输出始终大于20000,但不一致

转载 作者:行者123 更新时间:2023-12-03 13:18:42 24 4
gpt4 key购买 nike

package org.multithreading.basics;

public class ThreadJoin {

public static void main(String[] args) {

Counter counter = new Counter();

Thread t1 = new Thread(counter);
Thread t2 = new Thread(counter);

t1.start();
t2.start();

try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("Numbers counted =" + counter.getCount());
}

}

class Counter implements Runnable {

private int count;

@Override
public void run() {

for (int i = 0; i < 20000; i++) {
count++;
}

}

public int getCount() {
return count;
}

}

在此,输出始终为> 20000和<40000,并且始终为随机值。因此,在上面的代码中,主联接正在等待t1完成,但是为什么不等待t2,尽管联接在t1和t2上都存在。

最佳答案

该代码等待两个线程完成,将执行4000个++语句!

但是您需要了解线程如何工作,它们的变量访问如何工作,volatile和非 volatile 变量是什么,同步如何工作,它们为什么不同以及为什么您看到的结果是完全合理的并且是100%期望的。
x++基本上是x = x + 1(这不是一个精确的解释,但是这里发生的一般情况)=>如果两个线程同时运行该语句,则由于两个都读取x = 123,都调用123 + 1 => 124,然后您将丢失一个增量。都将124分配给x =>调用了两个增量,但是该值仅增加了一个。

关于java - 为什么这里的主线程不等待t2?在这里,输出始终大于20000,但不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59488545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com