3

Java では、CountdownLatch が状態 = 0 に達すると変更できないため、永久に開いたままになります。なぜ実装者は CountDownLatch の再利用を許可しないのだろうか?

4

3 に答える 3

5

再利用可能な場合、到着のさまざまな反復をどのように処理しますか? たとえば、 を待ちたいとしましょうCountDownLatch

CountDownLatch latch = new CountDownLatch(1);

latch.await();

次に、1 つのスレッドが呼び出します

latch.countDown();

awaitがリリースされます。これで、前のスレッドがカウントダウンした場合にのみ解放される別のスレッドができました。したがって、 を呼び出しlatch.await()ます。ラッチが変更可能である場合、スレッドは待機するか、続行する必要がありますか? ラッチは、この待機が別のサイクル (またはフェーズ) であってはならないことをどのように認識しますか?

結局、そうではなく、当然そうです。可変ラッチは難しいですが、可能です。Java 7 にはPhaserが含まれています。次の各反復をフェーズとして扱い、フェーザーに特定のフェーズで待機するように指示できます。

phaser.awaitAdvance(phase);

于 2014-12-04T15:18:02.877 に答える
1

これは CountDownLatch 固有の機能であるためです。CountDownLatch がカウンターをリセットすると、CyclicBarrier のように動作します。

于 2014-12-04T15:12:55.953 に答える
0

代わりにこれを行うことができます:

ReusableCountLatch latch = new ReusableCountLatch(); // creates latch with initial count 0
ReusableCountLatch latch2 = new ReusableCountLatch(10); // creates latch with initial count 10

latch.increment(); // increments counter

latch.decrement(); // decrement counter

latch.waitTillZero(); // blocks until counts falls to zero

boolean succeeded = latch.waitTillZero(200, MILLISECONDS); // waits for up to 200 milliseconds until count falls to zero

int count = latch.getCount(); // gets actual count

それを使用するには、依存関係を追加するだけです:

compile 'com.github.matejtymes:javafixes:1.3.0'
于 2019-06-20T23:20:18.057 に答える