-3

重複の可能性:
静的クラスに対する Java スレッドの影響

次のコードを検討してください。

    static class ThreadTest extends Thread {
        int x;
        int[] y;

        public ThreadTest(int x, int[] y) {
            this.x = x;
            this.y = y;
        }

        @Override
        public void run() {
            while (x< 10) {
                ++x;
                System.out.print("0");
            }
            while (y[0] < 10) {
                ++y[0];
                System.out.print('1');
            }
        }
    }

    public static void main(String args[]) {
        int x = 0;
        int[] y = new int[1];
        y[0] = 0;

        Thread A = new ThreadTest(x, y);
        Thread B = new ThreadTest(x, y);

        B.start();
        A.start();
    }

明らかに競合状態があります。印刷される 1 の最大数と最小数を評価するにはどうすればよいですか? 1 の印刷数が変化する原因は何ですか?

4

3 に答える 3

0

まず、質問に対する私のコメントを参照してください。

    public void run() {
        x = 0;

        y[0] = 0;             // line a
        while (x< 10) {      
            ++x;
            System.out.print("0");
        }

        while (y[0] < 10) {   // line b
            ++y[0];
            System.out.print('1');
        }
    }

スレッドAとスレッドBがそれぞれ同時に到達するline bと、101が印刷されますスレッドAがループを実行していて、10にインクリメントされたが、真偽がまだテストされていない場合、この時点でスレッドBはに到達し、0に変更されます。その後、スレッドAは「1」を出力する機会がさらに10回増えます。 、したがって、カウントは20です。line ay[0]line ay[0]

于 2012-05-19T18:23:53.380 に答える
0

The min amount of 1s is obviously 10, the max amount will be 20.

20 because worst case will be that both threads reach

while (y[0] < 10) 

at the same time every time, and then again reach

++y[0];

also at the same time every time, which will render one of the increments lost.

于 2012-05-19T18:44:13.260 に答える
0

最大数は 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 +2 + 1 です。1 つのスレッドが write 1 を 10 回実行したとします。値 y[0] == 0 を持つ他のスレッドは 1 回実行します。最初のスレッドは、2 番目のスレッドが停止した場所から最大 10 までループを実行できます。

于 2012-05-19T17:56:02.530 に答える