同步工具類可以是任何乙個物件,只要它根據其自身的狀態來協調執行緒的控制流。儲存物件的容器, 還能協調生產者和消費者等執行緒之間的控制流 take和put等方法將阻塞,直到佇列達到期望的狀態(佇列即非空,也非滿)。
相當於一扇門:在閉鎖到達結束狀態之前,這扇門一直是關閉的,並且沒有任何執行緒能通過,當到達結束狀態時,這扇門會開啟並允許所有執行緒通過。
到達結束狀態後,將不會再改變狀態,這扇門永遠保持開啟狀態。
countdownlatch(倒計數鎖存器) 是一種靈活的閉鎖實現
countdown方法遞減計數器
await方法等待計數器達到零,阻塞直到計數器為零或者等待中的執行緒中斷,或者等待超時
使用場景
示例:
public
class
testharness finally
} catch (interruptedexception e) }};
t.start();
}long start = system.nanotime();
startgate.countdown();
endgate.await();
long end = system.nanotime();
return end - start;
}}
也可以用作閉鎖。
計數訊號量用來控制同時訪問某個特定資源的運算元量,或者同時執行某個指定操作的數量。還可以用來實現某種資源池,或者對容器加邊界。
semaphore中管理者一組虛擬的許可,在執行操作時可以首先獲得許可,並在使用以後釋放許可,如果沒有許可,那麼acquire將阻塞直到有許可(或者直到中斷或者操作超時)。
release方法將返回乙個許可給訊號量,計算訊號量的一種簡化形式是二值訊號量,即初始值為1的semaphore。二值訊號量可以用作互斥體,並具備不可重入的加鎖語義:誰擁有這個唯一的許可,誰就擁有了互斥鎖。
semaphore可以用於實現資源池,例如資料庫連線池。
使用semaphore為容器設定邊界:
public
class boundedhashset
public boolean add(t o) throws interruptedexception finally
}public boolean remove(object o)
return wasremoved;
}}
柵欄(barrier)類似於閉鎖,它能阻塞一組執行緒直到某個事件發生。
閉鎖是一次性物件,一旦進入終止狀態,就不能被重置。
柵欄與閉鎖的關鍵區別在於,所有的執行緒必須同時到達柵字段置,才能繼續執行。閉鎖用於等待事件,而柵欄用於等待其他執行緒。
cyclicbarrier可以使一定數量的參與方反覆地在柵字段置匯集,它在並行迭代演算法中非常有用:這種演算法通常將乙個問題拆分成一系列相互獨立的子問題。
當執行緒到達柵字段置時將呼叫await方法,這個方法將阻塞直到所有執行緒都到達柵字段置。
同步工具類
同步工具類可以是任何乙個物件,只要它根據其自身的狀態來協調執行緒控制流。阻塞佇列 blockingqueue 可以作為同步工具類,其他型別的同步工具類還包括訊號量 semaphore 柵欄 barrier 以及閉鎖 latch 在平台類庫中還包含其他一些同步工具類的類,如果這些類還無法滿足需要,那麼...
同步工具類 CountDownLatch
countdownlatch是乙個同步工具類,它允許乙個或多個執行緒一直等待,直到其他執行緒執行完後再執行。例如,應用程式的主線程希望在負責啟動框架服務的執行緒已經啟動所有框架服務之後執行。countdownlatch是通過乙個計數器來實現的,計數器的初始化值為執行緒的數量。每當乙個執行緒完成了自己...
同步工具類之 Latch
同步工具類除了最熟悉的阻塞佇列之外,還包括semaphore barrier以及latch。同樣,我們也可以建立屬於自己的同步工具類。所有的同步工具類都包含了一些特定的結構屬性 比如,封裝了一些狀態,而這些狀態將決定執行同步工具類的執行緒是繼續執行海蛇等待,除此而外,還提供了一些方法對狀態進行操作,...