为什么java中的CountDownLatch不能再次改变其状态?

时间:2014-12-04 15:00:24

标签: java multithreading synchronization countdownlatch

在Java中,一旦CountdownLatch达到其状态= 0,它就无法更改它,因此它将永远保持打开状态。我想知道为什么实现者不允许重用CountDownLatch?

3 个答案:

答案 0 :(得分:5)

如果可以重复使用,您将如何处理不同的到达迭代?例如,假设您要等待CountDownLatch

CountDownLatch latch = new CountDownLatch(1);

latch.await();

然后一个线程调用

latch.countDown();

await已发布。现在你有另一个线程,只有在先前的线程倒计时才会释放。所以你调用latch.await()。如果锁存器是可变的,那么线程应该等待还是继续通过?闩锁如何知道这等待不应该是另一个周期(或阶段)?

最后,它并非如此。可变锁存器很难,但它是可能的。 Java 7推出Phaser。它将每个下一次迭代视为一个阶段,您可以告诉移相器等待特定阶段:

phaser.awaitAdvance(phase);

答案 1 :(得分:1)

因为它是CountDownLatch的特定功能。如果CountDownLatch将重置其计数器,那么它的行为就像CyclicBarrier

答案 2 :(得分: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'