Java線程同步三劍客

Java線程同步三劍客:CountDownLatch、CyclicBarrier和Phaser。

之前分享過這三者在性能測試中的應用,以及線程同步類CyclicBarrier在性能測試集合點應用的文章,但是文字讀起來略微枯燥了一些。

在我初學這塊內容的時候也是看到其他人的講解文章以及自己不斷嘗試才掌握了三個類的基本使用。後來某一次在搜資料的時候發現了有人將這些內容,畫成了流程圖的形式,非常好理解。

可能是因爲年代久遠了,圖像線條相對簡單,所以我就班門弄斧,使用draw.io重新畫了一下。

CountDownLatch

CountDownLatch類位於java.util.concurrent包下,利用它可以實現計數器的功能。比如有一堆任務需要多線程去執行,需要在所有任務執行完之後才能進行下一步這個場景,此時就可以利用CountDownLatch來實現這種功能了。

參考文章:CountDownLatch類在性能測試中應用

CyclicBarrier

CyclicBarrier也叫同步屏障,在JDK1.5被引入,可以讓一組線程達到一個屏障時被阻塞,直到最後一個線程達到屏障時,所以被阻塞的線程才能繼續執行。在執行很多個任務,但是這些任務中間某個節點需要等到其他任務都執行到固定的節點才能繼續進行,先到達的線程會一直等待所有線程到達這個節點。在性能測試中,經常會遇到N多個用戶同時在線的場景,一般處理起來都是先讓這N多個用戶登錄,然後保持登錄狀態,然後去併發請求。這個場景下CyclicBarrier就能完美解決我們的需求。

參考文章:CyclicBarrier類在性能測試中應用

Phaser

Phaser的功能與CountDownLatchCyclicBarrier有部分重疊,同時提供了更豐富的語義和更靈活的用法。Phaser比較適合這樣一種場景,一種任務可以分爲多個階段,現希望多個線程去處理該批任務,對於每個階段,多個線程可以併發進行,但是希望保證只有前面一個階段的任務完成之後才能開始後面的任務。這種場景可以使用多個CyclicBarrier來實現,每個CyclicBarrier負責等待一個階段的任務全部完成。但是使用CyclicBarrier的缺點在於,需要明確知道總共有多少個階段,同時並行的任務數需要提前預定義好,且無法動態修改。而Phaser可同時解決這兩個問題,可以隨時在任務過程中增加刪除需要等待的個數。

參考文章:Phaser類在性能測試中應用


FunTester騰訊雲年度作者、Boss直聘簽約作者,非著名測試開發er,歡迎關注。

點擊閱讀原文,查看公衆號歷史文章
- END -


本文分享自微信公衆號 - FunTester(NuclearTester)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章