9

待機/通知やロック/条件などの同時実行管理メカニズムは、偽のウェイクアップの影響を受けるようです。開発者は、状態が実際に変化したことを再確認することで、これらの予期しないウェイクアップに対応します。

CountDownLatch に関しては、偽のウェイクアップが問題になりますか?

4

2 に答える 2

14

CountDownLatch#await()状態の javadoc

現在のカウントが 0 より大きい場合、現在のスレッドはスレッド スケジューリングの目的で無効になり、次の 2 つのいずれかが発生するまで休止状態になります。

  • countDown()メソッドの呼び出しにより、カウントがゼロに達した場合。また
  • 他のスレッドが現在のスレッドに割り込みます。

メソッドが返されないことを意味する休眠状態。つまり、偽のウェイクアップが発生する可能性がありますが、awaitメソッドが戻ることはありません。

実装を見れば、これがどのように行われるかを正確に確認できますが、簡単に言えば、これは条件が満たされるまでループして「待機」する (スプリアス ウェイクアップを介してLockSuport#park、またはObject#waitスプリアス ウェイクアップの影響を受ける) という典型的なトリックです。

に関してはCountDownLatch、偽のウェイクアップが問題になりますか?

いいえ。

于 2015-07-22T21:16:25.237 に答える
4

Object.wait/Condition.awaitメソッドは「偽のウェイクアップ」の対象となります。

awaitメソッドはCountDownLatch

  • countDown() メソッドの呼び出しにより、カウントがゼロになります。または、他のスレッドが現在のスレッドに割り込みます。または 指定された待ち時間が経過した。

そのため、スプリアス起床が発生してもカウントに達していないため、復帰しません。

したがってCountDownLatchCyclicBarrierなどのシンクロナイザーは、スプリアス ウェイクアップの影響を受けません。

于 2015-07-22T21:23:09.473 に答える