待機/通知やロック/条件などの同時実行管理メカニズムは、偽のウェイクアップの影響を受けるようです。開発者は、状態が実際に変化したことを再確認することで、これらの予期しないウェイクアップに対応します。
CountDownLatch に関しては、偽のウェイクアップが問題になりますか?
待機/通知やロック/条件などの同時実行管理メカニズムは、偽のウェイクアップの影響を受けるようです。開発者は、状態が実際に変化したことを再確認することで、これらの予期しないウェイクアップに対応します。
CountDownLatch に関しては、偽のウェイクアップが問題になりますか?
CountDownLatch#await()
状態の javadoc
現在のカウントが 0 より大きい場合、現在のスレッドはスレッド スケジューリングの目的で無効になり、次の 2 つのいずれかが発生するまで休止状態になります。
countDown()
メソッドの呼び出しにより、カウントがゼロに達した場合。また- 他のスレッドが現在のスレッドに割り込みます。
メソッドが返されないことを意味する休眠状態。つまり、偽のウェイクアップが発生する可能性がありますが、await
メソッドが戻ることはありません。
実装を見れば、これがどのように行われるかを正確に確認できますが、簡単に言えば、これは条件が満たされるまでループして「待機」する (スプリアス ウェイクアップを介してLockSuport#park
、またはObject#wait
スプリアス ウェイクアップの影響を受ける) という典型的なトリックです。
に関しては
CountDownLatch
、偽のウェイクアップが問題になりますか?
いいえ。
Object.wait/Condition.await
メソッドは「偽のウェイクアップ」の対象となります。
のawait
メソッドはCountDownLatch
、
そのため、スプリアス起床が発生してもカウントに達していないため、復帰しません。
したがってCountDownLatch
、CyclicBarrier
などのシンクロナイザーは、スプリアス ウェイクアップの影響を受けません。