countdownlatch:閉鎖,也叫執行緒遞減鎖。對執行緒進行計數,在計數歸零之前執行緒會陷入阻塞;直到計數歸零為止,才會放開阻塞。
用給定的計數初始化 countdownlatch。由於呼叫了 countdown() 方法,所以在當前計數到達零之前,await 方法會一直受阻塞。之後,會釋放所有等待的執行緒,await 的所有後續呼叫都將立即返回。這種現象只出現一次——計數無法被重置。如果需要重置計數,請考慮使用 cyclicbarrier。
import j**a.util.concurrent.countdownlatch;
/** * 模擬:考試
* 需求:考官(執行緒a1,a2)和考生(執行緒b1、b2、b3、b4)
* 都到考場後才能開始考試
*/public class countdownlatchdemo
}class teacher implements runnable
@override
public void run() catch (exception e)
}}class student implements runnable
@override
public void run() catch (exception e)
}}
cyclicbarrier:柵欄。對執行緒進行計數,在計數歸零之前執行緒會陷入阻塞;直到計數歸零為止,才會放開阻塞。一組執行緒到達同乙個點後再分別繼續執行。(與閉鎖相比,並沒有結束執行緒)
它允許一組執行緒互相等待,直到到達某個公共屏障點 (common barrier point)。通俗講:讓一組執行緒到達乙個屏障時被阻塞,直到最後乙個執行緒到達屏障時,屏障才會開門,所有被屏障攔截的執行緒才會繼續幹活。一組執行緒結束後開啟另一組執行緒。
import j**a.util.concurrent.cyclicbarrier;
/** * 所有運動員跑到起跑線之後聽到命令才能跑出去
*/public class cyclicbarrierdemo
}class runner implements runnable
@override
public void run() catch (exception e)
}}
exchanger:交換機。用於交換兩個執行緒之間的資訊。
具體來說,exchanger類允許在兩個執行緒之間定義同步點。當兩個執行緒都到達同步點時,他們交換資料結構,因此第乙個執行緒的資料結構進入到第二個執行緒中,第二個執行緒的資料結構進入到第乙個執行緒中
import j**a.util.concurrent.exchanger;
public class exchangerdemo
}class producer implements runnable
@override
public void run() catch (interruptedexception e)
}}class consumer implements runnable
@override
public void run() catch (interruptedexception e)
}}
semaphore:訊號量。執行緒在獲取訊號之後執行**,而在訊號被全部占用之後,後來的執行緒需要阻塞,直到前面的執行緒釋放訊號,阻塞的執行緒才能獲取訊號執行邏輯。實際開發中,常用於限流。
【作用】限制某段**塊的併發數。semaphore有乙個建構函式,可以傳入乙個int型整數n,表示某段**最多只有n個執行緒可以訪問,如果超出了n,那麼請等待,等到某個執行緒執行完畢這段**塊,下乙個執行緒再進入。由此可以看出如果semaphore建構函式中傳入的int型整數n=1,相當於變成了乙個synchronized了。
從概念上講,訊號量維護了乙個許可集。如有必要,在許可可用前會阻塞每乙個 acquire(),然後再獲取該許可。每個 release() 新增乙個許可,從而可能釋放乙個正在阻塞的獲取者。但是,不使用實際的許可物件,semaphore 只對可用許可的號碼進行計數,並採取相應的行動。
訊號量semaphore是乙個非負整數(>=1)。當乙個執行緒想要訪問某個共享資源時,它必須要先獲取semaphore,當semaphore >0時,獲取該資源並使semaphore – 1。如果semaphore值 = 0,則表示全部的共享資源已經被其他執行緒全部占用,執行緒必須要等待其他執行緒釋放資源。當執行緒釋放資源時,semaphore則+1
import j**a.util.concurrent.semaphore;
public class semaphoredemo
}}//用餐的人
class easter implements runnable
/*** 桌子的數量是有限的
* 如果桌子被全部占用,後來的客人就需要等待
* 桌子相當於訊號,只要有訊號,就可以使用
*/@override
public void run() catch (exception e)
}}
countdownlatch的作用是允許1或n個執行緒等待其他執行緒完成執行;而cyclicbarrier則是允許n個執行緒相互等待。
countdownlatch的計數器無法被重置;cyclicbarrier的計數器可以被重置後使用,因此它被稱為是迴圈的barrier。
cyclicbarrier只能喚起乙個任務,countdownlatch可以喚起多個任務。
java 中的併發工具類簡介
1 等待多執行緒完成的countdownlatch countdownlatch允許乙個或多個執行緒等待其他執行緒完成操作。2 同步屏障cyclicbarrier cyclicbarrier的字面意思是可迴圈使用 cyclic 的屏障 barrier 它要做的事情是,讓一組執行緒到達乙個屏障 也可以...
併發工具類
常用的閉鎖工具類 countdownlatch cyclicbarrier futuretask。閉鎖應用場景 1.有a b c三個執行緒一起執行,可是a執行緒需要等待b c執行緒任務執行完畢才繼續往下執行。2.乙個執行緒的某步計算依賴於其它執行緒的執行結果。用生活例子舉例,小明約小張和小李吃飯,小...
Concurrent併發工具集合簡介
concurrenthashmap 乙個高併發的hashmap copyonwritearraylist 這是乙個list和arraylist是 一族,在讀多寫少的場合,這個list效能非常好 當寫入當時候,先對陣列進行了次複製,arrays.copyof oldarr,len 1 然後setarr...