2

一般に、Java開発者はすべて、メソッドの実行を1つずつ制御するために「同期」を使用する必要があることを知っていますが、次のコードは静的変数を選択して制御し、メソッドがエラーであることを示すために条件をシミュレートすることはできません。 、1000を超える値を出力するようにコードを変更するにはどうすればよいですか?

public class ThreadJunk implements Runnable{
    private Info info;
    public ThreadJunk(Info info) {
        this.info = info;
    }
    public static void main(String args[]) throws Exception {

        for(int j=0;j<100;j++) {
            Info ii = new Info();
            for(int i=0;i<1000;i++) {
                Thread t = new Thread(new ThreadJunk(ii));
                t.start();
            }
            System.out.println(ii.getValue());
        }
    }
    @Override
    public void run() {
        info.addValue();
    }
}

class Info {
    public static boolean IS_LOCKED = false;
    private int value = 0;
    public void addValue() {
        if(IS_LOCKED)
            return;
        IS_LOCKED = true;
        value++;
        IS_LOCKED = false;
    }
    public int getValue() {
        return value;
    }
}

私のコンピューターでは、1000を超える結果が得られたことはありません。

4

2 に答える 2

2

コードのこの部分を見てください。

Info ii = new Info();
for (int i = 0; i < 1000; i++) {
    Thread t = new Thread(new ThreadJunk(ii));
    t.start();
}

あなたが作成しているすべてのInfoオブジェクトについて、1000スレッド以下です。valueフィールドが複数1000回インクリメントされることを期待しないでください。

于 2013-02-26T09:58:07.620 に答える
0

Infoオブジェクトにはvalueメンバー変数があります。また、スレッド作成ロジックに従って、1 つの Info オブジェクトが 999 のスレッドで共有されます。

 for(int j=0;j<100;j++) {
            Info ii = new Info();
            for(int i=0;i<1000;i++) {
                Thread t = new Thread(new ThreadJunk(ii));
                t.start();
            }
            System.out.println(ii.getValue());
        }

したがって、次の値が 1000 を超えることはありません。

System.out.println(ii.getValue())
于 2013-02-26T10:03:06.520 に答える