-2

デッドロックに関して助けが必要です。ここでコードがデッドロックしている理由がわかりません。

さまざまなシナリオを試しました。

しかし、なぜ、どこに問題があるのか​​、まだわかりません。debuter通常は機能するはずですが、との間のデッドロックがどこにあるのかわかりませんtermine

  public class Interblocking {
           protected object obj = object();
           private boolean condition = true;

           public synchronized void debuter() {
               synchronized(obj) {
                   while (!condition) {
                       try {
                           obj.wait();
                       } catch (InterruptedExeption ie) {}
                   }
                   condition = false;
               }
           }

           public synchronized void terminer() {
               synchronized(obj) {
                   condition = true;
                   obj.notifyAll();
               }
           }
        }
4

3 に答える 3

0

あなたのコードは、あなたのコードができることとはまったく異なると思います。

おそらく、条件が true になるまでスレッドに入るスレッドを待機させる必要があります。

基本的な問題は、メソッドの同期キーワードです。彼らは、スレッドのみがインターブロッキングのインスタンスのメソッドにあることを保証します

メソッドの同期を削除します。

次の問題は状態です。ターミナーが呼び出された後にスレッドがどのように解放されるかは未定義です

への最初の呼び出しの後、条件が false であるため、 debuterへの 2 番目の呼び出しでデッドロックが発生します。そして、デビュターブロッキングにスレッドがあるためターミナーを実行する方法がありません

複数レベルのブロッキング オブジェクト (この場合は object と this) を使用すると、デッド ロックが発生する可能性が常に疑われます。

于 2012-06-03T14:47:29.380 に答える
0

コードにはデッドロック状態が含まれていません。リソースのグラフにサイクルがあると、デッドロックが発生します。リソース (obj) が 1 つしかないため、リソース グラフは単一のノードで構成され、サイクルを含めることはできません。

待つdebuterことconditionterminerありますが、長時間待つことはありません。

于 2012-06-03T15:09:35.310 に答える
0

編集(新しい回答)

メソッドwait()は、現在のスレッドのすべてのロックを解放しません。

したがって、スレッドが呼び出すdebuterと、ロックのみが解放されobjますが、ロックは保持thisされるため、他のスレッドはterminerメソッドを呼び出すことができません。

次に例を示します。

class WaitReleaseTest implements Runnable {
    Object lockA, lockB;
    public WaitReleaseTest(Object lockA, Object lockB) {
        this.lockA = lockA;
        this.lockB = lockB;
    }

    public void run() {
        System.out.println(Thread.currentThread().getName()
                + " attempting to acquire lockA");
        synchronized (lockA) {
            System.out.println(Thread.currentThread().getName()
                    + " attempting to acquire lockB");
            synchronized (lockB) {
                System.out.println(Thread.currentThread().getName()
                        + " holds lockA = " + Thread.holdsLock(lockA));
                System.out.println(Thread.currentThread().getName()
                        + " holds lockB = " + Thread.holdsLock(lockB));
                try {
                    lockB.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Object o1=new Object();
        Object o2=new Object();
        new Thread(new WaitReleaseTest(o1,o2)).start();
        TimeUnit.MILLISECONDS.sleep(500);
        new Thread(new WaitReleaseTest(o1,o2)).start();
    }
}

出力

Thread-0 attempting to acquire lockA
Thread-0 attempting to acquire lockB
Thread-0 holds lockA = true
Thread-0 holds lockB = true
Thread-1 attempting to acquire lockA
... now it waits
于 2012-06-03T13:52:24.027 に答える