0

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

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 と何個の 0 が印刷されますか? プログラムが実行されるたびに 1 の数が同じになるようにするにはどうすればよいですか? クラスが静的であることに注意してください

「1」の最大出現数と最小出現数を評価するにはどうすればよいでしょうか?

4

3 に答える 3

3

現在、 2 つのスレッドが同じ配列を変更しているため、コードに競合状態が含まれています。yこれは、出力される 1 の数が不確定であることを意味します。

プログラムが実行されるたびに 1 の数が同じになるようにするにはどうすればよいですか?

2 つのスレッド間に同期を導入する必要があります。

これは、さまざまな方法で行うことができます。Java で最も一般的なのは、synchronized共有状態を変更および/または読み取るコードの周りにブロックを使用することです。

代わりの方法は、int[1]配列を単一の に置き換えることAtomicIntegerです。これは、この特定のケースでは非常にうまく機能します。

クラスが静的であることに注意してください

クラスが存在するかどうかは、staticここではまったく関係ありません。これが意味するのは、 のインスタンスがThreadTest外部クラスのインスタンスへの暗黙的な参照を持たないということだけです。インスタンス間の状態の共有とは何の関係もありませんThreadTest(これは、ここで暗示していることだと思います)。

于 2012-05-19T10:29:37.853 に答える
0

クラスが であるかどうかは、staticここでは何の役割も果たしません。

変数は静的ではありませんが (静的であっThreadTest.yてはなりません)、すべてのスレッドに対して同じ配列への参照が格納されています。それが同期バグの場所です。両方のスレッドに同じ配列mainを与えるべきではありません。

于 2012-05-20T09:34:09.157 に答える
0

1 の最小量は明らかに 10 で、最大量は 20 になります。

20 最悪の場合、両方のスレッドが到達するため

while (y[0] < 10)

毎回同時に、そしてまた届く

++y[0];

また、毎回同時に、失われた増分の 1 つをレンダリングします。

于 2012-05-19T20:52:35.337 に答える