0

私はJavaスレッド、特にデッドロックの概念を調べていましたが、以下のコードを見つけました:

public static void main(String... a) {

    final String o1 = "Lock ";
    final String o2 = "Step ";

    Thread th1 = new Thread() {
        public void run() {
            while (true) {
                synchronized (o1) {
                    synchronized (o2) {
                        System.out.println(o1 + o2);
                    }
                }
            }
        }

    };

    Thread th2 = new Thread() {
        public void run() {
            while (true) {
                synchronized (o2) {
                    synchronized (o1) {
                        System.out.println(o2 + o1);
                    }
                }
            }
        }

    };

    new Thread(th1).start();
    new Thread(th2).start();

}

私の理解によると、プログラムが何をしているのかを説明してください。あるスレッドがロックを取得し、別のロックを取得しようとしていて、同じことが他のスレッドによって行われています。上記のプログラムのデッドロックを作成する他の方法については、アドバイスしてください。また、上記のコードで取得されているロックは、インスタンス レベルのロックです。

4

3 に答える 3

2

次のシナリオを検討してください。

  • th1ロックo1し、ロックする機会を得る前に中断されますo2
  • th2ロックo2し、ロックしようとしますo1

どちらのスレッドもそれ以上進行できず、デッドロックが発生します。

コードの元のバージョン (編集前) では、両方のスレッドが同じ順序 ( o1then o2) で 2 つのロックを取得したため、デッドロックの可能性はありませんでした。

于 2012-04-17T13:36:41.467 に答える
0

編集した投稿に基づいて、th1 は o1 を取得でき、th2 は o2 を取得できます。次に、両方のスレッドは、まだ取得していないロックを他のスレッドが解放するのを待っていますが、それは決して起こりません ==> デッドロック。

于 2012-04-17T13:43:58.480 に答える
0

デッドロックを作成するには、複数のスレッドが他のスレッドによって保持されているロックを待機している状況を作成する必要があります。例えば:

  • スレッド 1 には Lock1 と Lock2 が必要です
  • 順番にリクエスト: Lock1、Lock2
  • スレッド 2 には Lock1 と Lock2 が必要
  • 順番にリクエスト: Lock2、Lock1

    1. スレッド 1 は Lock1 を要求します。
    2. スレッド 2 は Lock2 を要求します。
    3. スレッド 1 は Lock1 を取得します。
    4. スレッド 2 は Lock2 を取得します。
    5. スレッド 1 は Lock2 を要求します。
    6. スレッド 2 は Lock1 を要求します。
    7. スレッド 1 は Lock2 を持つことができず、スレッド 2 がそれを保持しています。/スレッド 1 待機...
    8. スレッド 2 は Lock1 を持つことができず、スレッド 1 がそれ​​を保持しています。/スレッド 2 待機...

あなたの(最初の未編集の)例では、両方のスレッドが必要なロックを同じ順序で要求しており、これは非常に重要です。スレッド 1 がロック 1 を取得すると、スレッド 2 はロック 2 を取得してデッドロックを作成できません。これは、ロック 1 をまだ待機しているためです。両方のスレッドが同じ順序でロックを取得しようとするため、デッドロックは回避されます。

(新しい、編集された)例では、上記で説明したようにデッドロックが発生する可能性があります。

于 2012-04-17T13:42:32.817 に答える