Java: Notice() と NotifyAll() の再考
よく言われることですが、notify() は待機中のスレッドを 1 つだけ起動し、notifyAll () は待機中のすべてのスレッドをウェイクアップします。その実際的な意味を理解することが重要です。
コア違い
どちらの方法も待機中のスレッドを起動しますが、使用される方法に関係なく、一度にモニターの取得が許可されるスレッドは 1 つだけです。この選択プロセスは非決定的であり、VM または基盤となるシステム スレッド スケジューラに依存します。
notifyAll() の値
ほとんどのシナリオでは、notifyAll() は次のとおりです。 notify() 上で使用されます。 Notice() を使用する場合、実行するスレッドは 1 つだけ選択できます。次の例に示すように、これによりデッドロックが発生する可能性があります。
public class ProducerConsumerBroken { private Object[] buf; public synchronized void put(Object o) { while (buf.length == MAX_SIZE) wait(); buf[next] = o; notify(); } public synchronized Object get() { while (buf.length == 0) wait(); return buf[next--]; } }
この例では、システム スレッド スケジューラが継続的に 1 つのスレッドを優先し、他のスレッドが無期限に中断されたままになる可能性があるため、notify() によってデッドロックが発生する可能性があります。
notifyAll() によるデッドロックの回避
を使用することによりNoticeAll() を実行すると、待機中のすべてのスレッド (存在する場合) が起動され、各スレッドにロックを取得して続行する公平な機会が与えられます。これにより、デッドロックの可能性が排除されます。
notifyAll() を使用する場合
待機中のすべてのスレッドに、オブジェクトが実行されていることを確実に通知したい場合には、notifyAll() を使用します。待っているのが変わりました。これは、どのスレッドに通知が必要かを予測できない場合、または複数のスレッドが同じロックで待機している可能性がある場合に特に重要です。
推奨事項
一般的に経験則では、常にnotifyAll()を使用してください。これにより、潜在的なデッドロックが防止され、スレッド スケジューリングの公平性が確保されます。
以上がJava で「notifyAll()」を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。