JAVA 併發體系概覽

Java併發包主要有如下部分構成:編程

  • 同步對象 主要提供多個線程以何種方式進行通訊協做
  • 執行器  管理多線程,提供線程運行入口
  • 控制線程訪問資源的順序
  • 原子操做 對Java的基本類型進行了封裝,對integer等這些包裝類提供了原子操做
  • 併發框架  爲了簡化並行編程的複雜性,Java或者其餘公司定義的併發框架

 

以上對相關的類有一個大體的概覽,下面主要大概的講述一下同步對象的使用場景
Semaphore網絡

信號量:信號量經過計數器控制對共享資源的訪問。若是計數器大於0,訪問容許,若是爲0,訪問是拒絕的。計數器計數容許訪問共享資源的許可證,所以,爲了訪問資源,線程必須獲取信號量的訪問許可。一般,爲了使用信號量,但願訪問共享資源的線程嘗試取得許可。若是信號量的計數器大於0,就代表線程取得了許可證,這會致使信號量的計數減少;不然線程會被阻塞,直到可以獲取許可證爲止。當線程不須要訪問共享資源時,釋放許可證,從而增大信號量的計數。若是還有另外的一個線程正在等待許可證,該線程將在這一刻取得許可證多線程

CountDownLatch併發

有時候但願線程進行等待,直到發生一個或多個事件爲止。爲了處理這類狀況,併發API提供了CountDownLatch類。CountDownLatch在初始建立時帶有時間數量計數器,在釋放鎖存器以前,必須發生指定數量的時間。每次發生一個事件時,計數器遞減。當計數器達到0時,打開鎖存器。框架

Exechangerspa

其設計的目的是簡化兩個線程之間的數據交換。Exchager對象操做出奇的簡單;簡單的進行等待,知道兩個獨立的線程調用exchange()方法爲止。當發生這種狀況時,交換線程提供的數據。這種機制既優雅又易於使用。exchanger的用途很容易想象出來。例如:一個線程可能經過網絡接收信息準備好一個緩衝區,另外一個線程可能使用來自鏈接的信息填充這個緩衝區。這兩個線程能夠協同共工做,每當須要一個新的緩衝區時,就進行一次數據交換線程

CyclicBarrier:設計

兩個或者多個縣城組必須在預約的執行點等待,直到線程組中全部的線程都到達執行點爲止。爲了處理這種狀況,併發API提供了CyclicBarrier類。使用CyclicBarrier類能夠定義具備如下特色的同步對象,同步對象被被掛起,直到指定數量的線程都達到臨界點爲止。對象

Phaser:事件

該類的主要目的是容許一個或者多個活動階段的線程進行同步。例如,可能有一組線程實現了訂單處理應用程序的3個階段。在第一階段,每一個線程分別用於確認客戶信息,檢查清單,和確認訂價。當改階段完成後,第二階段有兩個線程,用於計算運輸成本以及使用的全部稅收。以後,最後一個階段肯定支付而且斷定大體的運輸時間。在過去,爲了同步構成這種狀況的多個線程,須要多一些工做。在提供Phaser類以後,這種處理如今就容易多了。 首先,Phaser類除了支持多個階段以外,其工做方式與CyclicBarrier相似,清楚這點是有幫助的。所以經過Phaser能夠定義等待特定階段完成同步對象。而後推行到下一階段,再次進行等待,直到那一階段完成爲止。Phaser也能夠用做同步只有一個階段的狀況,在這種狀況下,Phaser的行爲和CyclicBarrier很是類似。可是,Phaser的主要用途是同步多個階段。

相關文章
相關標籤/搜索