1. 程式人生 > >CountDownLatch CyclicBarrier 原理 總結

CountDownLatch CyclicBarrier 原理 總結

CountDownLatch原理

CountDownLatch是使用一組執行緒來等待其它執行緒執行完成,這個場景類似於一群人考試,先做的人先交了,但是在考試時間沒到的前提下,老師必須額等待最後一個學生完成交卷老師才能走,CountDownLatch使用Sync繼承AQS。建構函式很簡單地傳遞計數值給Sync,並且設定了state,這個state的值就是倒計時的數值,每當一個執行緒完成了自己的任務(學生完成交卷),那麼就使用CountDownLatch.countdown()方法來做一次state的減一操作,在內部是通過CAS完成這個更新操作,直到所有的執行緒執行完畢,也就是說計數值變成0,那麼就然後在閉鎖上等待的執行緒就可以恢復執行任務。

CyclicBarrier原理 柵欄

CyclicBarrier 的字面意思是可迴圈(Cyclic)使用的屏障(Barrier)。它要做的事情是,讓一組執行緒到達一個屏障(也可以叫同步點)時被阻塞,直到最後一個執行緒到達屏障時,屏障才會開門,所有被屏障攔截的執行緒才會繼續幹活。執行緒進入屏障通過CyclicBarrier的await()方法。
實現原理:在CyclicBarrier的內部定義了一個Lock物件,其實就是ReenTrantLock物件,每當一個執行緒呼叫CyclicBarrier的await方法時,將剩餘攔截的執行緒數減1,然後判斷剩餘攔截數是否為0,如果不是,進入Lock物件的條件佇列等待

。如果是,執行barrierAction物件的Runnable方法,然後將鎖的條件佇列中的所有執行緒放入鎖等待佇列中,這些執行緒會依次的獲取鎖、釋放鎖,接著先從await方法返回,再從CyclicBarrier的await方法中返回。
其中await方法:1.獲取lock物件,然後攔截數減一,直到攔截數為0,結束await
2.出現中斷,結束柵欄然後退出
3.超時也可以退出柵欄

CyclicBarrier和CountDownLatch的區別

1.CountDownLatch 可以說成一個或者一組執行緒1等待其它執行緒執行完畢,重點是每當一個執行緒的countdown減一的時候,是其中的一個執行緒執行完了一個任務,可以類比成大家一起考試,有的人提前交卷了,而老師還是不能走,因為還有人沒做完,得等全部人做完才行;
而CyclicBarrier則是一組執行緒互相等待,只有全部到達了柵欄點以後才能繼續執行;這個可以類比成上車,只有乘客把車上的位置佔用完了以後,車才能開始,也就是大家都在等位置坐滿,並不是說有一個人坐上車(到柵欄點),這個人就可以坐公交車走了,這個人心裡也清楚得等車上的位置坐滿車才能走,大家心裡預設是互相等待車完全坐滿,也就是前面說的一組執行緒互相等待的意思
1.CountDownLatch的計數器只能使用一次。而CyclicBarrier的計數器可以使用reset() 方法重置。所以CyclicBarrier能處理更為複雜的業務場景,比如如果計算髮生錯誤,可以重置計數器,並讓執行緒們重新執行一次。
2.CyclicBarrier還提供其他有用的方法,比如getNumberWaiting方法可以獲得CyclicBarrier阻塞的執行緒數量。isBroken方法用來知道阻塞的執行緒是否被中斷。比如以下程式碼執行完之後會返回true。
這裡寫圖片描述