Java線程同步三劍客:CountDownLatch、CyclicBarrier和Phaser。
之前分享過這三者在性能測試中的應用,以及線程同步類CyclicBarrier在性能測試集合點應用的文章,但是文字讀起來略微枯燥了一些。
在我初學這塊內容的時候也是看到其他人的講解文章以及自己不斷嘗試才掌握了三個類的基本使用。後來某一次在搜資料的時候發現了有人將這些內容,畫成了流程圖的形式,非常好理解。
可能是因爲年代久遠了,圖像線條相對簡單,所以我就班門弄斧,使用draw.io重新畫了一下。
CountDownLatch
CountDownLatch
類位於java.util.concurrent
包下,利用它可以實現計數器的功能。比如有一堆任務需要多線程去執行,需要在所有任務執行完之後才能進行下一步這個場景,此時就可以利用CountDownLatch
來實現這種功能了。
參考文章:CountDownLatch類在性能測試中應用
CyclicBarrier
CyclicBarrier
也叫同步屏障,在JDK1.5
被引入,可以讓一組線程達到一個屏障時被阻塞,直到最後一個線程達到屏障時,所以被阻塞的線程才能繼續執行。在執行很多個任務,但是這些任務中間某個節點需要等到其他任務都執行到固定的節點才能繼續進行,先到達的線程會一直等待所有線程到達這個節點。在性能測試中,經常會遇到N多個用戶同時在線的場景,一般處理起來都是先讓這N多個用戶登錄,然後保持登錄狀態,然後去併發請求。這個場景下CyclicBarrier
就能完美解決我們的需求。
參考文章:CyclicBarrier類在性能測試中應用
Phaser
Phaser
的功能與CountDownLatch
和CyclicBarrier
有部分重疊,同時提供了更豐富的語義和更靈活的用法。Phaser
比較適合這樣一種場景,一種任務可以分爲多個階段,現希望多個線程去處理該批任務,對於每個階段,多個線程可以併發進行,但是希望保證只有前面一個階段的任務完成之後才能開始後面的任務。這種場景可以使用多個CyclicBarrier
來實現,每個CyclicBarrier
負責等待一個階段的任務全部完成。但是使用CyclicBarrier
的缺點在於,需要明確知道總共有多少個階段,同時並行的任務數需要提前預定義好,且無法動態修改。而Phaser
可同時解決這兩個問題,可以隨時在任務過程中增加、刪除需要等待的個數。
參考文章:Phaser類在性能測試中應用
FunTester,騰訊雲年度作者、Boss直聘簽約作者,非著名測試開發er,歡迎關注。
-
甩鍋技能+1 -
FunTester測試框架架構圖初探 -
FunTester測試項目架構圖初探 -
從JVM堆內存分析驗證深淺拷貝 -
鏈路測試中參數流轉圖 -
單鏈路性能測試實踐 -
用Groovy處理JMeter中的請求參數 -
功能測試與非功能測試 -
Socket接口異步驗證實踐 -
“雙花”BUG的測試分享 -
圖片爬蟲實踐 -
Gradle+Groovy基礎篇 -
Gradle+Groovy提高篇
本文分享自微信公衆號 - FunTester(NuclearTester)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。