Java中的5種同步輔助類
原文地址 譯者:何一昕 校對:方騰飛
概述
當你使用synchronized關鍵字的時候,是通過互斥器來保障執行緒安全以及對共享資源的同步訪問。執行緒間也經常需要更進一步的協調執行,來完成複雜的併發任務,比如wait/notify模式就是一種在多執行緒環境下的協調執行機制。
通過API來獲取和釋放鎖(使用互斥器)或者呼叫wait/notify等方法都是底層呼叫的方式。進一步來說,有必要為執行緒同步建立更高層次的抽象。通常用到的同步輔助類,就是對2個或多個執行緒間的同步活動機制做進一步封裝,其內部原理是通過使用現有的底層API來實現複雜的執行緒間的協調。
有5種同步輔助類適用於常見的同步場景
1. Semaphore 訊號量是一類經典的同步工具。訊號量通常用來限制執行緒可以同時訪問的(物理或邏輯)資源數量。
2.CountDownLatch 一種非常簡單、但很常用的同步輔助類。其作用是在完成一組正在其他執行緒中執行的操作之前,允許一個或多個執行緒一直阻塞。
3.CyclicBarrier 一種可重置的多路同步點,在某些併發程式設計場景很有用。它允許一組執行緒互相等待,直到到達某個公共的屏障點 (common barrier point)。在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待,此時 CyclicBarrier 很有用。因為該 barrier在釋放等待執行緒後可以重用,所以稱它為迴圈的barrier。
4.Phaser 一種可重用的同步屏障,功能上類似於CyclicBarrier和CountDownLatch,但使用上更為靈活。非常適用於在多執行緒環境下同步協調分階段計算任務(Fork/Join框架中的子任務之間需同步時,優先使用Phaser)
5.Exchanger 允許兩個執行緒在某個匯合點交換物件,在某些管道設計時比較有用。Exchanger提供了一個同步點,在這個同步點,一對執行緒可以交換資料。每個執行緒通過exchange()方法的入口提供資料給他的夥伴執行緒,並接收他的夥伴執行緒提供的資料並返回。當兩個執行緒通過Exchanger交換了物件,這個交換對於兩個執行緒來說都是安全的。Exchanger可以認為是 SynchronousQueue 的雙向形式,在運用到遺傳演算法和管道設計的應用中比較有用。