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

Iva*_*lin 3 java multithreading synchronization countdownlatch

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

Joh*_*int 5

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

CountDownLatch latch = new CountDownLatch(1);

latch.await();
Run Code Online (Sandbox Code Playgroud)

然后一个线程调用

latch.countDown();

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

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

phaser.awaitAdvance(phase);