誰かが次のプログラムの出力を説明できますか:
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 ブロックに参加しているため、すべてのスレッドの実行が終了するまで待機し、各スレッドから 1 つずつ、4 つの値を出力するか、中断した場合はコンソールに出力することを期待します。どちらもここでは実際に起こっていません。
これがマルチスレッドでのデータ競合によるものである場合、ここでどのように機能しますか?