深入鎖和併發的核心 併發工具類(3)

2021-09-28 11:15:22 字數 1110 閱讀 6021

這三個類都是在定義在jdk的並發包util.concurrent中的併發工具類,用來實現多種不同用途的同步元件。

我更願意將其稱為柵欄,有了circle是說明這個工具是可以迴圈使用的。當乙個業務的情景適用於要等到多個執行緒同時準備好後,比如各個分銀行的業務處理完成後,總銀行才能進行結賬這樣的場景。就可以使用這個工具類,

其作用是在構造時候,指定需要等待的執行緒總數,每當乙個執行緒完成後,呼叫其await方法,當執行緒數達到指定的數量就能執行。

其內部方法較少,使用較為容易,且可以迴圈使用。包含的方法如下:

注意這裡的await(time,unit)讓子執行緒執行time時間之後再阻塞。

觀察其內部實現原理,較為簡單,也是呼叫其定義的成員變數鎖的condition來實現,每次子執行緒呼叫await()的方法,其內部count–,當count減少到0.呼叫condition.sinalall來實現breakbarrier的方法。

有意思的一點是在柵欄裡面還包含著下面的乙個執行緒成員變數,當柵欄被打破的時候執行此執行緒。在多種場景都有用途。

注意,當柵欄中的乙個執行緒終止丟擲異常的時候,立即破柵欄。

主要方法的構造如下:

在未滿足條件之前呼叫 await()使其阻塞。注意,該工具不能迴圈使用。

這個更像是乙個在作業系統中相似的訊號量機制,通過內部類繼承aqs來實現,仔細看發現其實現和鎖相似。

其含有的方法如下圖:

也是有公平和不公平兩種形態,通常用來限制獲取某種資源的執行緒數量。

其實現就是aqs中把state的數量從原來的0改為初始的資源數,其他的公平非公平的實現和鎖的都十分相似。

獲取acquire

釋放release

執行緒的併發工具類

countdownlatch 作用 是一組執行緒等待其他的執行緒完成工作以後在執行,加強版join await用來等待,countdown負責計數器的減一 cyclicbarrier 讓一組執行緒達到某個屏障,被阻塞,一直到組內最後乙個執行緒達到屏障時,屏障開放,所有被阻塞的執行緒會繼續執行cycl...

java中的併發工具類

類名稱類的簡介 類的特點 countdownlatch 允許乙個或者多個執行緒等待其他執行緒完成之後再執行後續操作 countdownlatch提供了乙個計數器,只能初始化一次,但是提供了乙個await方法,允許設定乙個時間,當等待一段時間後,就會不再阻塞當前執行緒。cyclicbarrier 讓一...

執行緒的併發工具類Fork Join

快速排序,歸併排序,二分查詢屬於分而治之。分治法的設計思想是 將乙個難以直接解決的大問題,分豁成一些規模較小的相同問題,以便 各個擊破,分而治之。通常我們不直接繼承forkjointask類,只需要直接繼承其子類。1.recursiveaction 用於沒有返回結果的任務,2.recursiveta...