2014-12-04 251 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