1

私は Java の同時実行に関する大学の授業を行っていますが、最近、1 から 5 までの番号が付けられた 5 つのスレッドを作成し、同期された静的メソッドを使用して各スレッドにそのスレッド番号をクラス内の静的変数に書き込むという簡単なタスクが与えられました。

講師から教えてもらった解決策は次のとおりです。

public class thread1 extends Thread {

private int threadNumber;
private static int threadCount = 0;
private static int value;

public thread1(){
      threadNumber = ++threadCount;
      System.out.println("Thread " + threadNumber + " is created" );
}

public synchronized static void setValue(int v){
      value = v;
      try{
           Thread.currentThread().sleep(100);
      }
           catch(InterruptedException e ){}

      System.out.println("the current value of the variable is " + value);
}

public void run() {
    setValue(threadNumber);
    return;
}

public static void main(String[] args) {
    for(int i = 0; i < 5; i++){
        thread1 thr = new thread1();
        thr.start();
}

}
}   

出力は次のようになります。

スレッド 1 が作成されます
スレッド 2 が作成されます
スレッド 3 が作成されます
スレッド 4 が作成されます
スレッド 5 が作成されます 変数の現在の値
は 1 変数
の現在の値は 2 変数
の現在の値は 3 変数
の現在の値は 4
変数の現在の値は 5 です

しかし、私が得ている出力は以下のとおりです。

スレッド 1 が作成されます
スレッド 2 が作成されます
スレッド 3 が作成されます
スレッド 4 が作成されます
スレッド 5 が作成されます 変数の現在の値
は 1 です 変数
の現在の値は 5 です 変数の現在の値
は 4 です 変数
の現在の値はは 3
変数の現在の値は 2 です

現在の値の順序は、明らかに毎回異なります。

私が与えられた解決策は間違っていますか?スレッドの各値変数を順番に出力するという意図された目的を達成するために明らかに機能していません。

毎回確実に1から5までの順序でスレッド番号を印刷する方法について、誰かが光を当てることができますか? 同期されたsetValueメソッドを使用するとうまくいくと思いましたが、明らかにそうではありません。

4

3 に答える 3

6

講師が提供するソリューションは絶対に正しいです。

5 つの異なるスレッドが作成され、それぞれが同期された同じメソッドにアクセスする必要があるため、意図した順序が得られません。

メソッドが同期されると、一度に 1 つのオブジェクトのみがアクセスできます

あなたの場合、setValueメソッドにアクセスできるスレッドは1つだけです。

when one Thread enters the method it acquires the lock and 
the other threads wait for the lock ,when this Thread releases the lock , 
any waiting Thread can acquire it and execute the setValue method.

スレッドがメソッドを実行する順序を保証することはできません。

そのため、このプログラムを実行するたびにスレッドの順序が異なります

于 2013-06-12T05:55:54.610 に答える
3

スレッドで start メソッドを呼び出した順序でスレッドが実行されるという保証はありません。同期ブロックは、2 つのスレッドが同時にアクセスできないことを意味するだけです。実行するスレッドの順序は、スケジューラによって決定されます。

于 2013-06-12T05:54:59.150 に答える
3

スレッドがモニターに入る順序は定義されていません。スレッドがモニター内で実行を終了すると、そのモニターで待機している他のスレッドがクリティカル セクションの制御を取得できます。

于 2013-06-12T05:55:47.863 に答える