スレッドの安全性を保証し、IllegalMonitorStateException を防ぐために、Object.wait() は同期されたブロック内に存在する必要があります。
Wait は、オブジェクトに関連付けられたモニターを解放し、他のスレッドがそれを取得できるようにします。 wait() が同期ブロックの外で呼び出される可能性がある場合、予期しない動作が発生する可能性があります。
同期 wait() なしのブロッキング キューの実装を検討してください:
class BlockingQueue { Queue<String> buffer = new LinkedList<>(); public void give(String data) { buffer.add(data); notify(); // Signal waiting consumer } public String take() throws InterruptedException { while (buffer.isEmpty()) { wait(); // Suspend thread without synchronization } return buffer.remove(); } }
この中で例:
この同期の問題は待機/通知に全般的に適用されます。特定の実装に関係なく、メカニズム。同期がないと、競合状態や予測できないスレッドの動作が発生するリスクが常にあります。したがって、「同期内で待機」ルールによりスレッドの安全性が確保され、そのような問題が防止されます。
以上がObject.wait() を常に同期ブロック内で呼び出す必要があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。