2012-04-14 81 views
15

當他解釋CountDownLatch和CyclicBarrier之間的區別時,我們的一位培訓師給出了一個示例。CountDownLatch和CyclicBarrier的真實生活實例

CountDownLatch:假設一塊石頭可以被10人擡起,所以你會等待所有10人來。那麼只有你可以舉起石頭。

CyclicBarrier:如果你要去野餐,而且你需要先在一些常見的地方見面,那麼你將從哪裏開始你的旅程。

如果有人同意這些評論,請給我一些細節。

我已經閱讀了這兩個類的sun API。但我需要更多的解釋。

+0

請參閱此http://mkorytin.blogspot.in/2011/07/cyclicbarrier-countdownlatch-and.html和http://shazsterblog.blogspot.in/2011/12/comparison-of-countdownlatch.html ..一些非常好的理解和例子 – 2013-04-05 19:06:40

+0

另一個鏈接,你可能會覺得有用的是 http://adnanfaizan.blogspot.in/2013/10/countdownlatch-tutorial-class-of-java.html – 2013-10-05 17:44:43

+0

@Sunny這是現在老問題,但這對我來說是新的。你能否回答2個問題(1)。您的循環屏障示例(野餐)在此處是否正確?問題2)。在這個循環障礙的例子中,如果有10個人去野餐,他們需要在一些共同的地方見面,在那裏所有的人都會重新開始他們的旅程。在到達俱樂部(或目的地)之前,他們可以在這段旅程中爲所有線程滿足多個共同點。 – 2017-06-29 15:50:50

回答

29

關鍵區別在於CountDownLatch將線程分隔爲等待者和到達者,而所有使用CyclicBarrier的線程都執行這兩個角色。

  • 通過鎖存器,服務員等待最後到達的線程到達,但那些到達的線程不會自行等待。
  • 有障礙,所有的線程到達,然後等待最後到達。

你的閂鎖示例意味着所有十個人必須等待將石頭一起擡起。不是這種情況。一個更好的現實世界的例子是一個考試提醒者,耐心地等待每個學生交出他們的考試。學生一旦完成考試並且可以自由離開,就不會等待。一旦最後一名學生參加考試(或時限到期),提醒者停止等待並離開考試。

+0

「有了門閂,服務員等待最後到達的線程到達,但是到達的線程不會自己等待。」根據我的理解,情況並非如此。因爲主線程總是等待所有線程倒數到0.請解釋。 – 2012-04-17 06:55:00

+0

這個例子應該像一個協調員檢查是否有10人可以吊起石頭。我對嗎?? – 2012-04-17 06:58:56

+4

@SAM - 錯誤的,只有在鎖定塊上調用await的線程,直到倒數到零。調用'countDown'的線程不會被阻塞。 – 2012-04-17 17:32:20

4

使用案例1假設您已將大型作業分成10個小型任務,每個任務都是一個線程。在考慮完成工作之前,你必須等待這10個任務的結束。

因此,主作業啓動器線程將CountDownLatch初始化爲所使用線程的數量,它將任務分配給線程並等待鎖定將採用await方法提升爲零。每個執行程序線程將在其任務結束時調用countDown。最後,當所有線程都完成時,主線程將被喚醒,以便它認爲所有工作都已完成。該場景使用CountDownLatch javadoc中描述的doneSignal鎖存器。

使用案例2假設您已將大型作業拆分爲分佈在n個線程上的n * m個任務。 m對應於一個矩陣行,並且您有一個總數來計算每行。在這種情況下,必須在每個任務結束後同步線程,以便該行的總和爲compute。在這種情況下,使用線程數n初始化的CyclicBarrier用於等待每個行計算的結束(實際上是m次)。

爲了比較兩者,CountDownLatch應該只使用1次,並且CyclicBarrier可以多次使用,因爲該算法需要一組線程的同步點。

4

A CyclicBarrier是可重複使用的,所以它更像是一個賽車巡迴賽,在巡迴賽的下一站之前,每個人都在一個航點上相遇。

+0

討論'CountDownLatch'示例[這裏](http://stackoverflow.com/a/3588523/230513)。 – trashgod 2012-04-14 18:55:49

0

CountDownLatch: 如果我們希望我們所有的線程做

東西+倒計時

使其他等待(用於計數到達零)線程能繼續,我們可以使用倒計時閂鎖。所有以前的線程都可以在這種情況下繼續進行倒計時,但不能保證在latch.countdown()等待其他線程到達latch.countdown()後,行會被處理() 但它有一個保證其他等待線程只會在latch.await()達到零後纔會啓動。

的CyclicBarrier: 如果我們希望所有的線程

做點什麼+等待在公共點+做點什麼

(每個等待通話將減少等待時間的線程進行在進一步)

CyclicBarrier功能可以通過調用latch.countdown(),然後由所有latch.await()由所有CountDownLatch實現一次線程。

但你不能重置/重用countdownlatch。

我使用CyclicBarrier的最佳示例是初始化多個緩存(由多個線程加熱),然後開始進一步處理,並且我想在同步中再次重新初始化其他緩存。

15

在假設劇院,

它被稱爲互斥,如果只有一個人讓觀看該劇
它被稱爲信號燈如果人N多讓觀看play.If有人離開戲劇期間可以允許其他人觀看比賽。
它被稱爲CountDownLatch如果沒有人允許進入,直到每個人騰空劇院。這裏每個人都有自由離開劇院。
它被稱爲循環障礙如果影院不會開始,直到每個人都進入影院。這裏showman不能開始表演,直到所有人進入並抓住座位。一旦完成同樣的障礙將申請下一個節目

在這裏,人是線程,玩是資源。

3

理論分野:

在CountDownLatch,主線程等待其他線程完成其執行。 在CyclicBarrier中,工作線程互相等待以完成其執行。

一旦計數達到零並且鎖存器打開,您就無法重複使用相同的CountDownLatch實例。另一方面,可以通過重置屏障重新使用循環障礙,一旦障礙被打破。

活生生的例子: -

CountDownLatch:考慮一個IT世界場景經理劃分開發團隊之間的模塊(A和B),他希望把它分配給QA團隊進行測試,只有當兩支隊伍都完成了他們的任務。

這裏管理器線程作爲主線程工作,開發團隊作爲工作線程工作。經理線程等待開發團隊線程完成他們的任務。

CyclicBarrier:考慮一下IT經理在開發團隊(A和B)之間劃分模塊的情況。他請假,並要求兩個團隊在完成相關任務後等待對方完成任務,然後將其分配給QA團隊進行測試。

這裏管理器線程作爲主線程工作,開發團隊作爲工作線程工作。開發團隊線程在完成任務後等待其他開發團隊線程。

5

真實世界示例 我可以看到所有的答案實際上都缺少一個真實的例子。由於在如何將這些類可以在軟件領域

  1. CountDownLatch 一個多線程下載管理器中使用。 下載管理器將啓動多個線程同時下載文件的每個部分(如果服務器支持多個線程下載)。這裏每個線程都會調用實例化鎖存器的倒數方法。在所有的線程都執行完畢,用倒計時鎖將整合在不同部分中發現的部分結合在一起成一個文件

  2. 的CyclicBarrier 相同的情況above..But假設文件是​​從下載的線程P2P。再次多個線程下載件。但是,在這裏,假設您希望在特定的時間間隔之後對下載的部分進行intergity檢查。這裏的循環障礙起着重要的作用。在每個時間間隔之後,每個線程將在屏障處等待,以便與cyclibarrier關聯的線程可以執行完整性檢查。這完整性檢查可以多由於時間做的CyclicBarrier

如果有什麼不正確,請大家指正。

0

顧名思義的循環屏障可用於循環。 例如: 我是一家公司,希望從各種招聘門戶網站Feed中獲取N份簡歷。 我有一個技能組數組,其中包含按優先級排序的技能。 對於前java,c#,python。我想找到N個恢復匹配java技能組, ,但如果我沒有找到所需的號碼。的簡歷,我再次搜索 上的下一個技能等。

我創建了一個工作人員,每個工作人員掃描簡歷,分配給職位的 。這兩名工作人員都將從其職位Feed中的主要技能組搜索 開始。

執行搜索後,工作人員將檢查N是否恢復 被找到。如果找到,工人將重置障礙,並返回 。否則它會等待另一名工人完成。 如果還沒有找到N個簡歷,那麼搜索將再次恢復 ,在技能組數組的下一個技能上。 因此,可以遞歸地/循環地調用搜索,而不需要 創建新的循環屏障。