0

重複の可能性:
待機が常に同期ブロックにある必要がある理由

Thread wait()メソッドは、同期されたコードブロックまたは同期されたメソッドのいずれかで内部で呼び出す必要があることに気づきました。それがなければ、それは投げています

java.lang.IllegalMonitorStateException

。なんで?

4

3 に答える 3

0

Javaチュートリアルから

public synchronized guardedJoy() {
// This guard only loops once for each special event, which may not
// be the event we're waiting for.
while(!joy) {
    try {
        wait();
    } catch (InterruptedException e) {}
}
System.out.println("Joy and efficiency have been achieved!");
}

このバージョンのguardedJoyが同期されているのはなぜですか?dがwaitの呼び出しに使用しているオブジェクトであるとします。スレッドがd.waitを呼び出すときは、dの固有のロックを所有している必要があります。そうでない場合、エラーがスローされます。同期メソッド内で待機を呼び出すことは、組み込みロックを取得する簡単な方法です。

あなたが持っているエラーは、彼らが例で参照しているエラーです。

于 2012-12-05T21:28:49.187 に答える
0

Object.waitについてはjavadocを参照してください。

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#wait()

「現在のスレッドはこのオブジェクトのモニターを所有している必要があります。スレッドはこのモニターの所有権を解放し、notifyメソッドまたはnotifyAllメソッドの呼び出しを通じて、このオブジェクトのモニターを待機しているスレッドに別のスレッドがウェイクアップするよう通知するまで待機します。その後、スレッドは次のように待機します。モニターの所有権を再取得して、実行を再開できます。」

于 2012-12-05T21:05:15.760 に答える
0

@synchronized(Obj) {...} は次のようになります:
SynchronizedObject.lock() ... SynchronizedObject.Unlock()

待機は基本的に次の略です:
SynchronizedObject.Unlock() & SynchronizedObject.Lock()

それはそれをより明確にします IMO ....ロックを解除するにはロックが必要です

于 2012-12-05T21:35:55.313 に答える