Object.wait() を呼び出すときにオブジェクトがオブジェクト モニターを所有していない場合、モニターが解放されるまで、オブジェクトにアクセスして通知リスナーを設定することはできません。代わりに、同期されたオブジェクトのメソッドにアクセスしようとするスレッドとして扱われます。
または、別の言い方をすれば、以下の間に違いはありません。
public void doStuffOnThisObject()
そして次の方法:
public void wait()
オブジェクト モニターが解放されるまで、両方のメソッドがブロックされます。これは、オブジェクトの状態が複数のスレッドによって更新されるのを防ぐための Java の機能です。これは単に、wait() メソッドに意図しない結果をもたらすだけです。
おそらく、wait() メソッドは同期されていません。これは、スレッドがオブジェクトに対して複数のロックを持っている状況を作成する可能性があるためです。(詳細については、 Java 言語仕様/ロックを参照してください。) 複数のロックは問題になります。メソッドが同期されている場合、メソッドのロックのみが元に戻され、潜在的な外部ロックが元に戻されたままになることが保証されます。これにより、コードにデッドロック状態が発生します。
Thread.sleep() に関する質問に答えるために、Thread.sleep() は、待機している条件が満たされていることを保証しません。Object.wait() と Object.notify() を使用すると、プログラマは手動でブロッキングを実装できます。条件が満たされたという通知が送信されると、スレッドのブロックが解除されます。例: ディスクからの読み取りが完了し、データをスレッドで処理できます。Thread.sleep() では、条件が満たされた場合はプログラマーがポーリングし、満たされていない場合はスリープに戻る必要があります。