標籤:
當你使用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 的雙向形式,在運用到遺傳演算法和管道設計的應用中比較有用。
Java中的5種同步輔助類