學習筆記 --- Java 併發程式設計總結一 countDownLatch,CyclicBarrier,Semaphore
在多執行緒程式設計中有三個同步工具需要我們掌握,分別是Semaphore(訊號量),countDownLatch(倒計數門閘鎖),CyclicBarrier(可重用柵欄)
- CountDownLatch和CyclicBarrier都能夠實現執行緒之間的等待,只不過它們側重點不同:
CountDownLatch一般用於某個執行緒A等待若干個其他執行緒執行完任務之後,它才執行;
而CyclicBarrier一般用於一組執行緒互相等待至某個狀態,然後這一組執行緒再同時執行;
另外,CountDo
wnLatch是不能夠重用的,而CyclicBarrier是可以重用的。
- Semaphore其實和鎖有點類似,它一般用於控制對某組資源的訪問許可權。
CountDownLatch 計數器 倒計數門閘鎖
CountDownLatch這個類能夠使一個執行緒等待其他執行緒完成各自的工作後再執行。例如,應用程式的主執行緒希望在負責啟動框架服務的執行緒已經啟動所有的框架服務之後再執行。
CountDownLatch是通過一個計數器來實現的,計數器的初始值為執行緒的數量。每當一個執行緒完成了自己的任務後,計數器的值就會減1。當計數器值到達0時,它表示所有的執行緒已經完成了任務,然後在閉鎖上等待的執行緒就可以恢復執行任務
應用場景
CountDownLatch一般用於某個執行緒A等待若干個其他執行緒執行完任務之後,它才執行
CountDownLatch強調的n個執行緒,等待若干個其他執行緒結束,執行緒開始執行
實現最大的並行性:有時我們想同時啟動多個執行緒,實現最大程度的並行性
開始執行前等待n個執行緒完成各自任務:應用程式啟動類要確保在處理使用者請求前,所有N個外部系統已經啟動和運行了。
死鎖檢測:你可以使用n個執行緒訪問共享資源,在每次測試階段的執行緒數目是不同的,並嘗試產生死鎖
CyclicBarrier 迴圈屏障 可重用柵欄
CyclicBarrier 的字面意思是可迴圈使用(Cyclic)的屏障(Barrier)。它要做的事情是,讓一組執行緒到達一個屏障(也可以叫同步點)時被阻塞,直到最後一個執行緒到達屏障時,屏障才會開門,所有被屏障攔截的執行緒才會繼續幹活
應用場景
- CyclicBarrier強調的是n個執行緒,大家相互等待,只要有一個沒完成,所有人都得等著
Semaphore 訊號量
在Java的併發包中,Semaphore類表示訊號量。Semaphore內部主要通過AQS(AbstractQueuedSynchronizer)實現執行緒的管理。Semaphore有兩個建構函式,引數permits表示許可數,它最後傳遞給了AQS的state值。執行緒在執行時首先獲取許可,如果成功,許可數就減1,執行緒執行,當執行緒執行結束就釋放許可,許可數就加1。如果許可數為0,則獲取失敗,執行緒位於AQS的等待佇列中,它會被其它釋放許可的執行緒喚醒。
應用場景
訊號量主要用於兩個目的,一個是用於多個共享資源的互斥使用,另一個用於併發執行緒數的控制