wait() 呼び出しが常に同期ブロックに含まれるのはなぜですか?
Object.wait() 呼び出しは、同期ブロック内に配置する必要があります。 IllegalMonitorStateException。これは、モニターの取得と wait() のセマンティクス間の相互作用によるものです:
モニターの取得と解放:
Java では、各オブジェクトに関連付けられたモニターがあります。スレッドが同期ブロックに入ると、そのオブジェクトのモニターを取得します。これにより、他のスレッドがオブジェクトに同時にアクセスできなくなります。
Wait() セマンティクス:
Wait() は、呼び出されたオブジェクトに関連付けられたモニターを解放します。スレッドが wait() を呼び出すと、モニターを解放し、別のスレッドが同じオブジェクトに対して Notice() または NoticeAll() を呼び出すまで待機します。その時点で、待機中のスレッドはモニターを再取得します。
同期なしの潜在的な損害:
同期ブロックの外で wait() を呼び出すことができた場合、複数のスレッドがオブジェクトに同時にアクセスできるようになり、不整合やデッドロックが発生する可能性があります。
次のシナリオを考えてみましょう:
同期の役割:
囲み同期ブロック内で wait() を呼び出すと、条件がチェックされて wait() が呼び出される前にモニターが取得されることが保証されます。これにより、待機中のスレッドがモニターを解放するまで、他のスレッドがオブジェクトの状態を変更したり、notify() を呼び出したりすることができなくなります。この同期によりスレッドの安全性が確保され、潜在的な不整合やデッドロックが防止されます。
以上がJava では「wait()」呼び出しを常に同期ブロック内に入れなければならないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。