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/