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 的雙向形式,在運用到遺傳算法和管道設計的應用中比較有用。線程

相關文章
相關標籤/搜索