JUC併發工具類

2021-10-14 15:37:42 字數 2106 閱讀 9375

countdownlatch允許乙個或多個執行緒等待其他執行緒完成操作

具體分析:

countdownlatch的建構函式接收乙個int型別的引數作為計數器,而int具體數值則代表要等待多少個執行緒點的完成!

例如,程式中初始設定為2,則表示等待的數量為2.

然後就是,countdownlatch的countdown()的方法,每次使用該方法,所維護的計數器數值就減一。

例如,每個子執行緒的測試邏輯中,都有countdown方法的呼叫,每次呼叫,計數器減一。

最後就是,countdownlatch的await()方法,await阻塞於計數器大於一時,並在計數器為0時,結束阻塞!

例如,程式中主線程main中的await方法,只有計數器為0時,才會往下執行!

細節思考

1.所謂的計數器必須大於或者等於0,只不過當等於0的時候,await方法就會返回,不在阻塞當前執行緒。

2.countdown()方法,可以用在任何地方,所以,計數器的實際意義,其實是管理countdown()方法的呼叫次數。通俗來說就是,countdown()方法可以用在多執行緒中,也可以代表乙個執行緒中的多個執行步驟。

讓一組執行緒到達乙個屏障(也就是所謂的同步點)時被阻塞,知道最後乙個執行緒到達屏障時,屏障才會開門,所有被該屏障所阻塞的執行緒才能夠繼續執行

具體說明:

首先,建構函式,同樣傳入乙個int引數,作為計數器,該計數器代表,必須等到n個同步點都完成await的方法呼叫後,繼續執行各個執行緒同步點之後的**邏輯!

例子中涉及到的await()方法就是所謂的同步點,必須等到完成計數器所要求的的數量同步點之後,才會解除阻塞!

這裡需要注意的是,該工具類還設有乙個高階的建構函式,可以指定達到指定數量的同步點後,也就是解除屏障後,優先執行那個執行緒!public cyclicbarrier(int parties,runnable barrieraction).

思考:countdownlatch和cyclicbarrier的區別:

最主要體現在對於計數器的處理上,countdownlatch的計數器只能使用一次,而cyclicbarrier的計數器可以使用reset()方法進行重置。所以cyclicbarrier可以處理相對更加複雜的場景

semaphore是用來控制同時訪問特定資源的執行緒數量

多年以來,我都覺得從字面上很難理解semaphore所表達的含義,只能把它比作是控制流量的紅綠燈。比如xx馬路要限制車流量,只允許同時有一百輛車在這條馬路上行駛,其他的必須要在路口等待,所以前面一百輛車會看到綠燈,可以開進這條馬路,後面的車會看到紅燈,不能進入xx馬路,但是假如前面一百輛車中有五輛車已經離開了xx馬路,那麼後面就允許有五輛車再進入馬路,這個例子中所說的車就是執行緒,駛入馬路就表示執行緒正在執行,離開馬路就表示執行緒執行完成,看見紅燈就表示執行緒被阻塞,不能執行

semaphore的構造方法接收乙個整形int的數值,表示可用的許可證數量。new semaphore(10)表示允許10個執行緒獲取許可證,也就是程式的最大併發數是10,semaphore的用法很簡單,首先執行緒使用acquire()方法獲取乙個許可證,使用完之後呼叫release()方法歸還許可證!

exchanger是乙個用於執行緒間協作的工具類,exchanger用於進行執行緒間的資料交換。他提供乙個同步點,在這個同步點,兩個執行緒可以交換彼此的資料,這兩個執行緒通過exchange()方法交換資料,如果第乙個執行緒先執行exchange()方法,它會一直等待第二個執行緒也執行exchange()方法,當兩個執行緒都到達同步點後,這兩個執行緒就可以交換資料

如果兩個執行緒中有乙個執行緒沒有執行exchange()方法,那麼另乙個執行緒會一直等待下去,如果要防止特殊情況發生,避免某個執行緒持續等待,可以設定等待的最大時長,exchange(string x,long timeout,timeutil util);

exchange()方法的簡單理解就是,等待兩個執行緒都到達同步點,然後使用該方法,把資料傳給另乙個執行緒,並返回從另乙個執行緒中所傳送過來的資料

一種可重用的同步屏障,功能上類似於cyclicbarrier和countdownlatch,但使用上更為靈活。非常適用於在多執行緒環境下同步協調分階段計算任務(fork/join框架中的子任務之間需同步時,優先使用phaser)

JUC併發工具使用案例

包含以下併發工具的呼叫 synchronized 同步鎖 reentrantlock 同步鎖 condition 執行緒通訊 reentrantreadwritelock 讀寫鎖 讀寫分離 stampedlock 讀寫鎖 悲觀 樂觀 讀的同時可以寫 atomicinteger 原子性遞增 longa...

juc包下的關於併發四大工具類

countdownlatch 閉鎖 使用countdownlatch可以實現類似多執行緒下計數器的功能。構造器 1.引數count為計數器 2.呼叫await 方法時,執行緒被掛起,它會等待直到count值為0才繼續執行 過載 public boolean await long await time...

JUC併發程式設計

併發程式設計的本質 充分利用cpu的資源 執行緒就是乙個單獨的資源類,沒有任何的附屬操作。傳統的synchronize鎖本質 佇列,鎖 lock.lock 加鎖 trynew reentrantlock lock.lock 加鎖 finally lock.unlock 解鎖鎖是什麼,如何判斷鎖的是誰...