有人可以解释以下程序的输出:
public class DataRace extends Thread {
static ArrayList<Integer> arr = new ArrayList<>();
public void run() {
Random random = new Random();
int local = random.nextInt(10) + 1;
arr.add(local);
}
public static void main(String[] args) {
DataRace t1 = new DataRace();
DataRace t2 = new DataRace();
DataRace t3 = new DataRace();
DataRace t4 = new DataRace();
t1.start();
t2.start();
t3.start();
t4.start();
try {
t1.join();
t2.join();
t3.join();
t4.join();
} catch (InterruptedException e) {
System.out.println("interrupted");
}
System.out.println(DataRace.arr);
}
}
输出:
- [8, 5]
- [9、2、2、8]
- [2]
我无法理解输出中不同数量的值。我希望主线程要么等待所有线程完成执行,因为我将它们加入到 try-catch 块中,然后输出四个值,每个线程一个,或者在中断的情况下打印到控制台。这两者都没有真正发生在这里。
如果这是由于多线程中的数据竞争,它如何在这里发挥作用?