Java併發程式設計實戰--閉鎖 CountDownLatch
閉鎖是一種同步工具類,可以延遲執行緒的進度直到其到達終止狀態。閉鎖的作用相當於一扇門:在閉鎖到達結束狀態之前,這扇門一直是關閉的,並且沒有任何執行緒能通過,當到達結束狀態時,這扇門會開啟並允許所有的執行緒通過。當閉鎖到達結束狀態後,將不會再改變狀態,因此這扇門將永遠保持開啟狀態。
閉鎖可以用來確保某些活動直到其他活動都完成後才繼續執行。
CountDownLatch是一種靈活的閉鎖實現,可以在上述各種情況中使用,它可以使一個或多個執行緒等待一組事件發生。閉鎖狀態包括一個計數器,該計數器被初始化為一個正數,表示需要等待的事件數量。countDown方法遞減計數器,表示有一個事件已經發生了,而await方法等待計數器達到零,這表示所有需要等待的事件都已經發生。如果計數器的值非零,那麼await會一直阻塞直到計數器為零,或者等待中的執行緒中斷,或者等待超時。
可以向CountDownLatch物件設定一個初始的數字作為計數值,任何呼叫這個物件上的await()方法都會阻塞,直到這個計數器的計數值被其他的執行緒減為0為止。
下面程式TestHarness中給出了閉鎖的兩種常見用法。TestHarness建立一定數量的執行緒,利用它們併發地執行指定的任務。它使用兩個閉鎖,分別表示“起始門”和“結束門”。起始門計數器的初始值為1,而結束門計數器的初始值為工作執行緒的數量。每個工作執行緒首先要做到就是在啟動門上等待,從而確保所有執行緒都就緒後才開始執行。而每個執行緒要做的最後一個事情是將呼叫結束門的countDown方法減1 ,這能使主執行緒高效低等待直到所有工作執行緒都執行完畢,因此可以統計所消耗的時間。
public class TestHarness {
public long timeTasks(int nThreads, final Runnable task)
throws InterruptedException {
// 開始的倒數鎖
final CountDownLatch startGate = new CountDownLatch(1);
// 結束的倒數鎖
final CountDownLatch endGate = new CountDownLatch(nThreads);
for (int i = 0; i < nThreads; i++) {
Thread t = new Thread() {
public void run() {
try {
startGate.await();
try {
task.run();
} finally {
endGate.countDown();
}
} catch (InterruptedException ignored) {
}
}
};
t.start();
}
long start = System.nanoTime();
startGate.countDown();
endGate.await();
long end = System.nanoTime();
return end - start;
}
}
java併發程式設計實戰pdf及案例原始碼下載:
http://download.csdn.net/detail/xunzaosiyecao/9851028
作者:jiankunking 出處:http://blog.csdn.net/jiankunking
相關文章
- 漫畫:Java併發閉鎖CountDownLatchJavaCountDownLatch
- Java併發工具類(閉鎖CountDownLatch)JavaCountDownLatch
- 《JAVA併發程式設計實戰》顯式鎖Java程式設計
- Java併發程式設計實戰(4)- 死鎖Java程式設計
- 《JAVA併發程式設計實戰》取消和關閉Java程式設計
- 併發程式設計實戰——鎖分段程式設計
- Java併發程式設計:CountDownLatch、CyclicBarrier和SemaphoreJava程式設計CountDownLatch
- Java併發程式設計實戰Java程式設計
- 併發程式設計之:CountDownLatch程式設計CountDownLatch
- Java 併發程式設計(十三) -- CountDownLatch原始碼分析Java程式設計CountDownLatch原始碼
- Java併發程式設計實戰--FutureTaskJava程式設計
- Java併發程式設計實戰 04死鎖了怎麼辦?Java程式設計
- Java併發程式設計-鎖及併發容器Java程式設計
- Java併發程式設計實戰--Amdahl定律Java程式設計
- Java併發系列—併發程式設計挑戰Java程式設計
- Java併發程式設計實戰總結 (一)Java程式設計
- Java併發程式設計實戰——讀後感Java程式設計
- Java併發程式設計實戰--筆記三Java程式設計筆記
- Java併發程式設計實戰--筆記四Java程式設計筆記
- Java併發程式設計實戰--筆記二Java程式設計筆記
- Java併發程式設計實戰--this引用逸出Java程式設計
- Java併發程式設計實戰--筆記一Java程式設計筆記
- Java併發程式設計實戰--事實不可變物件Java程式設計物件
- 併發程式設計之 Java 三把鎖程式設計Java
- java程式設計思想之併發(死鎖)Java程式設計
- 【面試實戰】# 併發程式設計面試程式設計
- 《JAVA併發程式設計實戰》任務執行Java程式設計
- 《JAVA併發程式設計實戰》物件的組合Java程式設計物件
- 實戰Java高併發程式設計模式視訊Java程式設計設計模式
- 【java併發程式設計實戰4】偏向鎖-輕量鎖-重量鎖的那點祕密(synchronize實現原理)Java程式設計
- Java併發程式設計實戰--協作物件間的死鎖與開放呼叫Java程式設計物件
- Java併發程式設計實戰--計數訊號量(Semaphore)Java程式設計
- Java併發程式設計 - 第十一章 Java併發程式設計實踐Java程式設計
- Java併發程式設計——深入理解自旋鎖Java程式設計
- 《JAVA併發程式設計實戰》基礎構建模組Java程式設計
- Java併發程式設計實踐Java程式設計
- 《Java併發程式設計實戰》學習筆記 任務執行和取消關閉Java程式設計筆記
- java併發程式設計JUC第九篇:CountDownLatch執行緒同步Java程式設計CountDownLatch執行緒