Java のnotify() メソッドとnotifyAll() メソッドのニュアンスを理解する
オンラインで入手可能な多くの説明にもかかわらず、Java のnotify() メソッドの違いは) および NoticeAll() メソッドは、多くの場合、起動されたスレッドの数に単純化されます。ただし、より深く理解すると、より微妙な概念が明らかになります。
どちらのメソッドもオブジェクトのモニターで待機しているスレッドをウェイクアップしますが、ロックを取得して続行するために選択されるスレッドは 1 つだけです。 Notice() の場合、VM は任意の選択を行いますが、notifyAll() はシステム スレッド スケジューラに依存して選択を行います。
重要な疑問が生じます。2 つのメソッドの実際的な違いは何でしょうか。
notify() よりもnotifyAll() の重要性
プロデューサー/コンシューマーの例は、一般に notifyAll() が推奨される選択肢である理由を示しています。
public synchronized void put(Object o) { while (buf.size() == MAX_SIZE) { wait(); } buf.add(o); notifyAll(); } public synchronized Object get() { while (buf.size() == 0) { wait(); } Object o = buf.remove(0); notifyAll(); return o; }
この例では、参考資料で説明されている一連のイベントが発生すると、notify() がデッドロック状況を引き起こす可能性があります。ただし、notifyAll() を使用すると、待機中のすべてのスレッドが起動され、適切な同期が可能になるため、このデッドロックは回避されます。
追加の洞察:
以上がJava では、notifyAll() が一般に notify() よりも好まれるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。