ロックを通知し、すぐにそのロックを再度通知するとどうなりますか? そのロックで待機しているスレッドが 2 つ以上あるとします。2 つのスレッドが起動されることが保証されていますか? それとも、スレッドが 1 つだけ起動され、2 番目の通知が不要になる可能性はありますか?
lock.notify();
lock.notify();
ありがとう!
ロックを通知し、すぐにそのロックを再度通知するとどうなりますか? そのロックで待機しているスレッドが 2 つ以上あるとします。2 つのスレッドが起動されることが保証されていますか? それとも、スレッドが 1 つだけ起動され、2 番目の通知が不要になる可能性はありますか?
lock.notify();
lock.notify();
ありがとう!
そのロックで待機しているスレッドが 2 つ以上あるとします。2 つのスレッドが起動されることが保証されていますか?
はい。各通知は、待機中のキューからスレッドを取得し、ブロックされたキューに入れます。起動されたスレッドは、最初synchronized
に問題のロックにアクセスする必要があります。ロックを待機しているスレッドが 1 つしかない場合、2 番目のスレッドnotify()
は何もしません。
スレッドはすぐに実行を開始しないことに注意してください。を実行できるようにするためにsynchronized
ブロック内にある必要があるため、実行する前に再びアクセスする必要があります。へのアクセスを待機しているブロック キューに、他の複数のスレッドが既に存在している可能性があります。lock
wait()
lock
lock
この動作は、notifyAll() の呼び出しに似ていると思います (この場合は、notifyTwo() に似ています)。
起動されたスレッドは、このオブジェクトで同期するために活発に競合している可能性のある他のスレッドと通常の方法で競合します。たとえば、目覚めたスレッドは、このオブジェクトをロックする次のスレッドになることに関して、信頼できる特権や不利な点を享受しません。