2014-12-04 43 views
3

在Java曾经的CountDownLatch达到= 0的状态,它不能改变它,所以它永远是开放的。我想知道为什么实现者不允许重用CountDownLatch?为什么java中的CountDownLatch不能再改变它的状态?

+0

如果允许重新使用,你会重新使用它,而它仍在计数停止吗? – 2014-12-04 15:01:59

+0

@Stav Saad如果它不是0,那么不要允许,否则允许。我实现了可重用的Latch。顺便说一句,标准CyclicBarrier是可重用的。我没有看到的原因 – 2014-12-04 15:08:44

回答

1

因为它是CountDownLatch特定的功能。如果CountDownLatch将重置其计数器那么它会表现得有点像为的CyclicBarrier

+2

叶夫Dorofeev我不同意,的CyclicBarrier等待所有线程扎堆在1点的代码,而使用事件(倒数)锁存作品和所有参与者在不同的代码部分等待。 – 2014-12-04 15:15:07

5

如果它是可重用的,你将如何处理到来的不同迭代?例如,假设你想在CountDownLatch上等待。

CountDownLatch latch = new CountDownLatch(1); 

latch.await(); 

然后一个线程调用

latch.countDown();

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

最后,它不会是理所当然的。一个可变的锁定是困难的,但它是可能的。 Java 7推出了Phaser。它把每下一次迭代的阶段,您可以告诉移相器,等待在一个特定的阶段:

phaser.awaitAdvance(phase);

+0

谢谢约翰,很清楚。 :) – 2014-12-04 15:20:24

相关问题