Java 併發系列之八:java 併發工具(4個)

1. CountDownLatch

 

2. CyclicBarrier

3. Semaphore

4. Exchanger

5. txt

 1 java 併發工具
 2     通俗理解
 3         CountDownLatch
 4             等ABCD 4我的都結束了,本身才能開始,結束一個減一個
 5         CyclicBarrier
 6             我和A,B,C,D 5我的互相等待,會合了再一塊兒進電影院,到一個減一個
 7         Semaphore
 8             計數器,雞蛋籃子裏只能放5個雞蛋,缺幾個,才能放幾個
 9         Exchanger
10             A和B交換數據
11     CountDownLatch
12         CountDownLatch 它容許一個或多個線程等待其餘N個指定數量線程完成操做
13         CountDownLatch也能夠實現join的功能,而且比join的功能更多
14         AQS(隊列同步器) 共享鎖
15         內部類
16             sync爲CountDownLatch的一個內部類,而Sync繼承AQS。
17                 採用共享鎖來實現的。
18         重要操做
19             CountDownLatch(int count) 
20                 構造一個用給定計數初始化的 CountDownLatch,count爲計數器的初始值,也能夠理解爲該共享鎖能夠獲取的總次數。
21             await()
22                 使當前線程在鎖存器倒計數至零以前一直等待,除非線程被中斷
23             awit(long time, TimeUnit unit)
24                 帶指定時間的await方法,這個方法在等待特定時間以後,就不會阻塞當前線程。
25             countDown()
26                 遞減鎖存器的計數,若是計數到達零,則釋放全部等待的線程。
27             一個線程調用countDown方法 happen-before 另一個線程調用 await 方法
28         注意CountDownLatch不能回滾重置。
29     CyclicBarrier
30         定義
31             可循環使用的同步屏障:它容許一組線程互相等待,直到達到某個公共屏障點(common barrier point)
32             通俗講:讓一組線程到達一個屏障是被阻塞,直到最後一個線程到達屏障時,屏障纔會開門,全部被屏障攔截的線程纔會繼續幹活
33         底層採用ReentrantLock + Condition 實現
34         重要操做
35             兩個構造函數
36                 CyclicBarrier(int parties):parties表示屏障攔截的線程數量(插入的屏障數),每一個線程調用await方法告訴CyclicBarrier已經到達了屏障,而後當前線程被阻塞。
37                 CyclicBarrier(int parties, Runnable barrierAction) :用於在線程到達屏障前,優先執行barrierAction,方便處理更復雜的業務場景
38             其餘方法
39                 getNumberWaiting
40                     得到CyclicBarrier阻塞的線程數量
41                 isBrocken
42                     瞭解阻塞的線程是否被中斷
43                 await()
44                     插入屏障,到達了屏障,本質上至關於屏障數-1
45         應用場景
46             多線程結果合併的操做,用於多線程計算數據,最後合併計算結果的應用場景
47         CyclicBarrier V.S. CountDownLatch
48             CountDownLatch的做用是容許1個或N個線程等待其餘線程完成執行;
49 CyclicBarrier則是容許N各線程互相等待
50             CountDownLatch的計數器沒法被重置,只能使用一次若是須要重置計數,請考慮使用CyclicBarrier.
51 CyclicBarrier的計數器能夠被reset重置後使用,所以它被稱爲是循環的barrier,能處理更爲複雜的業務場景。例如計算髮生錯誤,能夠重置計數器,並讓線程從新執行一次
52     Semaphore
53         信號量
54             計數器,用來控制同時訪問特定資源的線程數量,他經過協調各個線程,以保證合理的使用公共資源
55         內部採用共享鎖實現
56         信號量Semaphore是一個非負數(>=1)。當一個線程想要訪問某個共享資源時,它必需要先獲取Semaphore,當Semaphore>0 時,獲取該資源並使 Semaphore-1. 若是Semaphore=0,則表示所有的共享資源已經被其餘線程所有佔用,線程必需要等待其餘線程釋放資源。當線程釋放資源時,Semaphore+157         從概念上講,信號量維護了一個許可集。若有必要,在許可可用前會阻塞每個acquire(),而後再獲取該許可。每一個release()添加一個許可,從而可能釋放一個正在阻塞的獲取者。可是,不使用實際的許可對象,Semaphore只對許可的號碼進行計數,並採起相應的行動。
58         重要操做
59             Semaphore(int permits)
60                 構造函數,接受一個整型的數字,表示可用的許可證數量,也就是最大的併發量
61             acquire
62                 獲取一個許可證
63             tryAcquire
64                 嘗試獲取一個許可證
65             release
66                 歸還許可證
67             int  availablePermits()
68                 返回此信號量中當前可用的許可證數
69             int  getQueueLength()
70                 返回正在等待獲取許可證的線程數
71             boolean hasQueuedThreads()
72                 是否有線程正在等待獲取許可證
73             void reducePermits(int reduction)
74                 減小reduction個許可證
75             Collection getQueuedThreads()
76                 返回全部等待獲取許可證的線程集合
77         應用場景
78             用於流量控制,特別是公用資源有限的應用場景,好比數據庫鏈接。
79     Exchanger
80         定義
81             交換者,是一個用於線程間協做的工具類,用於進行線程間的數據交換,兩個線程
82             它提供一個同步點,用於進行線程間成對配對及交換數據,
83         具體
84             第一個線程先執行exchange()方法,它會一隻等待第二個線程也執行exchange()方法,當兩個線程都到達同步點時,兩個線程就能夠交換數據,將本線程生產出來的數據傳遞給對方
85         容許在併發任務之間交換數據。具體來講,Exchanger類容許在兩個線程之間定義同步點。當兩個線程都到達同步點時,他們交換數據結構,所以第一個線程的數據結構進入到第二個線程中,第二個線程的數據結構進入到第一個線程中
86         應用場景
87             遺傳算法
88                 交叉
89             校對工做
90                 AB崗錄入電子銀行流水
91             Exchanger 可能被視爲 SynchronousQueue 的雙向形式。Exchanger 可能在應用程序(好比遺傳算法和管道設計)中頗有用。
View Code

 

6. 參考網址

  1. 參考來源:http://cmsblogs.com/wp-content/resources/img/sike-juc.png
  2. 《Java併發編程的藝術》_方騰飛PDF 提取碼:o9vr
  3. http://ifeve.com/the-art-of-java-concurrency-program-1/
  4. Java併發學習系列-緒論
  5. Java併發編程實戰
  6. 死磕 Java 併發精品合集
相關文章
相關標籤/搜索