6.5 JUC — 同步器

同步器名稱 作用
CountDownLatch 倒數計數器,構造時設定計數值,當計數值歸零後,所有阻塞線程恢復執行;其內部實現了AQS框架
CyclicBarrier 循環柵欄,構造時設定等待線程數,當所有線程都到達柵欄後,柵欄放行,然後再進行新的一次循環。其內部通過ReentrantLock和Condition實現同步
Semaphore 信號量,類似於“令牌”,用於控制共享資源的訪問數量;其內部實現了AQS框架
Exchanger 交換器,類似於雙向柵欄,用於線程之間的配對和數據交換;其內部根據併發情況有“單槽交換”和“多槽交換”之分
Phaser 多階段柵欄,相當於CyclicBarrier的升級版,可用於分階段任務的併發控制執行;其內部比較複雜,支持樹形結構,以減少併發帶來的競爭

CountDownLatch

CountDownLatch是一個輔助同步器類,用來作計數使用,先設定一個計數初始值,當計數降到0時,將會觸發一些事件。類似於生活中飯局,先來的人要等人齊了才能開飯。
初始計數值在構造CountDownLatch對象時傳入,每調用一次 countDown() 方法,計數值就會減1。線程可以調用CountDownLatch的await方法進入阻塞,當計數值降到0時,所有之前調用await阻塞的線程都會釋放。
注意:CountDownLatch的初始計數值一旦降到0,無法重置。如果需要重置,可以考慮使用CyclicBarrier。
一般有以下兩種用法:

  1. 作爲開關/入口:將初始計數值爲1的 CountDownLatch 作爲一個的開關或入口,在調用 countDown() 的線程打開入口前,所有調用 await 的線程都一直在入口處等待。
  2. 作爲完成信號:將初始計數值爲N的 CountDownLatch作爲一個完成信號點:使某個線程在其它N個線程完成某項操作之前一直等待。

CyclicBarrier

CyclicBarrier類似是一個可以循環使用的CountDownLatch,讓線程到達柵欄時被阻塞(調用await方法),直到到達柵欄的線程數滿足指定數量要求時,柵欄纔會打開放行。

構造器:
CyclicBarrier(int parties); 參數parties就是傳入的計數總數。
CyclicBarrier(int parties, Runnable barrierAction);  該構造器制定了一個計數總數和一個用於達到計數總數後立刻執行的Runnable任務。

Semaphore

Semaphore,又名信號量,這個類的作用有點類似於“許可證”。有時因爲一些原因需要控制同時訪問共享資源的最大線程數量,比如出於系統性能的考慮需要限流,或者共享資源是稀缺資源,以保證合理的使用公共資源。
Semaphore維護了一個許可集,其實就是一定數量的“許可證”。當有線程想要訪問共享資源時,需要先獲取(acquire)的許可;如果許可不夠了,線程需要一直等待,直到許可可用。當線程使用完共享資源後,可以歸還(release)許可,以供其它需要的線程使用。
構造器:
Semaphore(int permits); 參數permits是許可證數量。
Semaphore(int permits, boolean fair); 參數fair控制公平/非公平鎖

Exchanger

交換器,這個類的主要作用是交換數據。Exchanger可以看成是一個雙向柵欄。

生產者/消費者 先來到交換器處,如果對方還未到,就會進行等待直到對方來到,通過調用exchange函數來達到交換信息的目的。
public V exchange(V x);通過泛型V來交換各自定製型的信息。

Phaser

功能與 CyclicBarrier和CountDownLatch有些類似,類似於一個多階段的柵欄,並且功能更強大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章