線程同步輔助類
信號量(Semaphore):是一種計數器,用來保護一個或者多個共享資源的訪問。它是併發編程的一種基礎攻擊,大多數編程語言都提供了這個機制。
CountDownLatch:是java語言提供的同步輔助類,在完成一組正在其餘線程中執行的操做以前,它容許線程一直等待。
CyclicBarrier:是java語言提供的同步輔助類,它容許多個線程在某個集合點處進行相互等待。
Phaser:是java語言提供的同步輔助類,它把併發任務分紅多個階段運行,在開始下一階段以前,當前階段中的全部線程都必須執行完成,這是java7 APi中的新特性。
Exchanger:是java語言提供的同步輔助類,它提供了兩個線程之間的數據交換點。
1.信號量Semaphore類
若是線程要訪問一個共享資源,它必須先獲取信號量。若是信號量的內部計數器大於0,信號量將減1,而後容許訪問這個共享資源。計數器大於0意味着可使用的資源,所以線程將被容許使用其中一個資源。
不然,若是信號量的計數器等於0,信號量將會把線程置入休眠直至計數器大於0。計數器等於0的時候意味着全部的共享資源已經被其餘線程使用了,因此須要訪問這個共享資源的線程必須等待。
當線程使用完某個共享資源時,信號量必須被釋放,以便其餘線程可以訪問共享資源。釋放操做將使信號量的內部計數器增長1。
信號量實現臨界區必須遵循的三個步驟,從而保護對共享資源的訪問:
首先,必須經過acquire()方法獲取信號量;
其次,使用共享資源執行必要的操做;
最後,必須經過release()方法釋放信號量。java
信號量的公平性
Semaphore類的構造器提供了第二個傳入參數。這個參數是boolean型的。若是傳入false值,那麼建立的信號量就是非公平模式的,與不使用這個參數的效果同樣。若是傳入true值,那麼建立的信號量是公平模式的。編程
2.CountDownLatch類
java併發API提供了CountDownLatch類,它是一個同步輔助類。在完成一組正在其餘線程中執行的操做以前,它容許線程一直等待。這個類使用一個整數進行初始化,這個整數就是線程要等待完成的操做的數目。當一個線程要等待某些操做先執行完時,須要調用await()方法,這個方法讓線程進入休眠直到等待的全部操做都完成。當某一個操做完成後,它將調用countDown()方法將CountDownLatch類的內部計數器減1.當計數器變成0的時候,CountDownLatch類將喚醒全部調用await()方法而進入休眠的線程。數據結構
3.CyclicBarrier類
java併發API提供了CyclicBarrier類,它是一個同步輔助類。它容許兩個或者多個線程在某個點上進行同步。
CyclicBarrier類使用了一個整型數進行初始化,這個數是須要在某個點上同步的線程數。當一個線程到達指定的點後,它將調用await()方法等待其餘的線程。當線程調用await()方法後,CyclicBarrier類將阻塞這個線程並使之休眠直到全部其餘線程到達。當最後一個線程調用CyclicBarrier類的await()方法時,CyclicBarrier對象將喚醒全部在等待的線程,而後這些線程將繼續執行。
CyclicBarrier類提供了getNumberWaiting()方法和getparties()方法,前者將返回在await()上阻塞的線程的數目,後者返回被CyclicBarrier對象同步的任務數。
CyclicBarrier對象的重置,是經過CyclicBarrier類提供的reset()方法完成的。當重置發生後,在awai()方法中等待的線程將收到一個BrokenBarrierException異常。
CyclicBarrier類提供了isBroken()方法,若是處於損壞狀態就行true,不然返回false.併發
4.Phaser類
java併發API還提供了一個更復雜、更強大的同步輔助類,即Phaser,它容許執行併發多階段任務。當咱們有併發任務而且須要分解成幾步執行時,這種機制就很是適用。Phaser類機制是在每一步結束的位置對線程進行同步,當全部的線程都完成了這一步,才容許執行下一步。編程語言
經常使用方法:
arriveAndDeregister()方法:調用Phaser對象的arriveAndDeregister()方法來通知Phaser對象當前線程已經結束這個階段,而且將再也不參與接下來的階段操做。至關於取消該線程的註冊。
arriveAndAwaitAdvance()方法:調用Phaser對象的arriveAndAwaitAdvance()方法,來通知Phaser對象當前線程已經完成了當前階段,須要被阻塞直到其餘線程也都完成當前階段。
isTerminated()方法:調用了phaser對象的isTerminated()方法,當phaser對象不存在參與同步的線程時,phaser是終止的,該方法將返回true。當取消全部線程的註冊時,phaser對象就會變成終止狀態。ui
5.Exchanger類
java併發API還提供了一個同步輔助類,它就是Exchanger,它容許在併發任務之間交換數據。具體來講,Exchanger類容許在兩個線程之間定義同步點。當兩個線程都到達同步點時,它們交換數據結構,所以第一個線程的數據結構進入到第二個線程中,同時第二個線程的數據結構進入到第一個線程中。線程