java多線程十二 閉鎖CountDownLatch

CountDownLatch

CounyDownLatch是一個同步類,他允許一個或多個線程一直等待,直到其他線層的操作執行完成後再去執行。

A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.

工作原理

CountDownLatch實現使用一個計數器,計數器的初始值爲線程的數量。每當一個線程完成了自己的任務後,計數器的值就會減1.當計數器值到達0時,它表示所有的線程已經完成了任務,然後再閉鎖上等待的線程就可以恢復執行任務。

構造函數

CountDownLatch類只提供了一個構造函數

public CountDownLatch(int count) {...}

上面再描述CountDownLatch的工作原理時也說過,CountDownLatch實現使用一個計數器,而參數cout就是初始化計數器的值,該值一經初始化就不能再被修改。

常用API解析

await()方法

Causes the current thread to wait until the latch has counted down to zero, unless the thread is interrupted.

該方法用來式當前線程處於阻塞狀態,知道閉鎖中計數的值遞減到0,或者線程被中斷

await(long timeout, TimeUnit unit)

Causes the current thread to wait until the latch has counted down to zero, unless the thread is interrupted, or the specified waiting time elapses.

該方法同await()方法,多出的兩個參數定義了等待時間,把阻塞線程恢復的條件變爲了三個。計數值遞減到0、線程中斷、到達超時時間

countDown()方法

Decrements the count of the latch, releasing all waiting threads if the count reaches zero.

該方法用來遞減閉鎖中計數器的值,當值到達0時所有等待的線程將恢復執行。

getCount()方法

Returns the current count.

該方法獲取當前計數器的值。

使用場景

  1. 實現最大的並行性:有時我們想同時啓動多個線程,實現最大程度的並行性。例如,我們想測試一個單例類。如果我們創建一個初始計數爲1的CountDownLatch,並讓所有線程都在這個鎖上等待,那麼我們可以很輕鬆的完成測試。我們只需要頂用一次countDown()方法就可以讓所有的等待線程同時恢復執行
  2. 開始執行前等待n個線程完成各自任務:例如應用程序啓動類要確保在處理用戶請求前,所有N個外部系統已經啓動和運行了。
  3. 死鎖檢測:一個非常方便的使用場景是,你可以使用n個線程訪問共享資源,在每次測試階段的線程數目是不同的,並嘗試產生死鎖

參考:
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html
http://www.importnew.com/15731.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章