CyclicBarrier原始碼分析

2021-08-24 23:44:28 字數 690 閱讀 4395

字面意思回環柵欄,通過它可以實現讓一組執行緒等待至某個狀態之後再全部同時執行。叫做回環是因為當所有等待執行緒都被釋放以後,cyclicbarrier可以被重用。我們暫且把這個狀態就叫做barrier,當呼叫await()方法之後,執行緒就處於barrier了。

其實它和countdownlatch很類似,也是個計數器。

但他有兩個優點:

1.乙個他的計數器能復用,而countdownlatch減到0就沒了

2.他可以設定所以執行緒同時到位了,執行某個邏輯。通過入參設定runnable

構造引數主要就這個,裡面就是儲存下到達的閾值,以及之後的執行體。

下面看await方法,主要就是執行dowait方法

這裡可以先明確,這個類主要就是靠reetrantlock()和condition來實現功能的。

先看前部分:

先是讓呼叫這個方法的執行緒取獲取鎖,獲取到後,前面的broken的判斷,就是用來執行緒是不是被中斷了,如果被中斷了,那就停止掛起,全部喚醒。

然後每呼叫一次await,就把count減一,如果減到0,就選最後到達的執行緒進行執行這個run執行體。然後再呼叫nextgeneration方法把執行緒都喚醒。

看下半部分:

如果呼叫await的執行緒沒有達到閾值,就呼叫conditon的掛起操作,如果有時間,就用有過期時間的掛起。如果中途被中斷,同樣喚醒其他執行緒。剩下的就是一些校驗規則,就不細述了。

併發程式設計之 CyclicBarrier 原始碼分析

在之前的介紹 countdownlatch 的文章中,countdown 可以實現多個執行緒協調,在所有指定執行緒完成後,主線程才執行任務。但是,countdownlatch 有個缺陷,這點 jdk 的文件中也說了 他只能使用一次。在有些場合,似乎有些浪費,需要不停的建立 countdownlatc...

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...

ThreadPoolExecutor原始碼閱讀

執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...