2

誰かが次のプログラムの出力を説明できますか:

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 つの値を出力するか、中断した場合はコンソールに出力することを期待します。どちらもここでは実際に起こっていません。

これがマルチスレッドでのデータ競合によるものである場合、ここでどのように機能しますか?

4

3 に答える 3