Java併發之訊號量、倒計數門閂、迴圈柵欄和LockSupport
1、訊號量(Semaphore)
訊號量(Semaphore)是對鎖的擴充套件,內部鎖synchronized和重入鎖ReentrantLock一次都只允許一個執行緒訪問一個資源,而訊號量卻可以指定多個執行緒同時訪問某個資源。
// 指定準入數,即能同時申請多少個許可
public Semaphore(int permits)
// fair指定是否公平
public Semaphore(int permits, boolean fair)
主要邏輯方法
// 嘗試獲取一個准入許可,若無法獲得,則執行緒等待,直到有執行緒釋放一個許可或者當前執行緒被中斷
public void acquire ();
// 不響應中斷
public void acquireUninterruptibly();
//嘗試獲取,不會進行等待,立即返回
public boolean tryAcquire();
public boolean tryAquire(long timeout, TimeUnit unit);
// 執行緒訪問資源結束後,釋放一個許可
public void release();
示例程式碼
final Semaphore semap = new Semaphore(6);
public void run() {
try{
//申請一個訊號量
semap.acquire();
doWork();
semap.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
2、倒計數門閂(CountDownLatch)
CountDownLatch用來控制執行緒的等待,它可以讓某個執行緒等待直到倒計時結束,再開始執行。
應用場景:比如流水線,後面的工序必須等到前面的工序做完之後才能繼續做。
構造方法如下:
// 指定計時器數量
public CountDownLatch(int count);
示例程式碼
static final CountDownLatch latch = new CountDownLatch(5 );
//子執行緒
public void run() {
try {
doWork();
latch.countDown(); //表示一個執行緒已經完成了一個流程任務,計時器減1
} catch(InterruptedException e) {
e.printStackTrace();
}
}
//主執行緒
public static void main(String[] args) {
ExecutorService exec = Excutors.newFixedThreadPool(5);
for(int i=0; i<5; i++) {
exec.submit(子執行緒);
}
//等待檢查直到 計數為0
latch.await();
exec.shutdown();
}
3、迴圈柵欄(CyclicBarrier)
CyclicBarrier是CountDownLatch的升級版,功能更復雜強大
Cyclic意為迴圈,就是說可以反覆使用。比如指定計數器為10,當湊齊第一批10個執行緒後,計數器自動歸0;接著下一批…
應用場景:10個人一組一組的完成某個任務。
構造方法如下:
// parties為計數總數,barrierAction 為一次計數完成後的回撥
public CyclicBarrier(int parties, Runnable barrierAction);
示例程式碼
//子執行緒
public void run() {
try {
//等待所有執行緒到齊(達到計數),到齊後會第一次回撥 barrierAction
cyclic.await();
doWork();
//進行下一輪計數
//等待所有執行緒 doWork 都做完,做完後會第二次回撥 barrierAction
cyclic.await();
} catch(InterruptedException e) {
e.printStackTrace();
} catch(BrokenBarrierException e) {
e.printStackTrace();
}
}
對於BrokenBarrierException 異常,表示當前的柵欄CyclicBarrier已經破損了,可能系統已經沒有辦法等到所有的執行緒到齊了。如果繼續等待,可能就是白等。需進行異常處理。
4、執行緒阻塞工具類(LockSupport)
LockSupport 是一個阻塞工具,他可以線上程的任意位置阻塞執行緒。和Object.wait()相比,它不需要先獲得某個物件的鎖,不會丟擲InterruptedException.
//阻塞當前執行緒
public static void park() {
UNSAFE.park(false, 0L);
}
//為當前執行緒設定阻塞物件,阻塞物件會出現線上程Dump中
public static void park(Object blocker) {
Thread t = Thread.currentThread();
setBlocker(t, blocker);
UNSAFE.park(false, 0L);
setBlocker(t, null);
}
//定時阻塞
public static void parkNanos(long nanos) {
if (nanos > 0)
UNSAFE.park(false, nanos);
}
public static void parkUntil(long deadline) {
UNSAFE.park(true, deadline);
}
public static void unpark(Thread thread) {
if (thread != null)
UNSAFE.unpark(thread);
}
1、定時中斷
2、為當前執行緒設定一個阻塞物件
3、處於park()掛起執行緒的狀態是WAITING狀態,使用suspend()掛起執行緒的狀態是Runnable狀態。
4、LockSuport.park() 支援中斷影響,但是不會丟擲InterruptedException,只能通過Thread.interrupted() 等方法獲取中斷標記。
public void run() {
LockSupport.park();
if(Thread.interrupted()) {
System.out.println("執行緒被中斷了");
}
System.out.println("執行結束了");
}
相關推薦
Java併發之訊號量、倒計數門閂、迴圈柵欄和LockSupport
1、訊號量(Semaphore) 訊號量(Semaphore)是對鎖的擴充套件,內部鎖synchronized和重入鎖ReentrantLock一次都只允許一個執行緒訪問一個資源,而訊號量卻可以指定多個執行緒同時訪問某個資源。 // 指定準入數,即能同時
java併發之Semaphore(計數訊號量)
Semaphore一個計數訊號量。從概念上講,訊號量維護了一個許可集。如有必要,在許可可用前會阻塞每一個 acquire(),然後再獲取該許可。每個 release() 新增一個許可,從而可能釋放一個正在阻塞的獲取者。但是,不使用實際的許可物件,Semaphore 只對可用
Java併發學習之十六——執行緒同步工具之訊號量(Semaphores)
當一個執行緒想要訪問某個共享資源,首先,它必須獲得semaphore。如果semaphore的內部計數器的值大於0,那麼semaphore減少計數器的值並允許訪問共享的資源。計數器的值大於0表示,有可以自由使用的資源,所以執行緒可以訪問並使用它們。
《java併發程式設計實戰》:執行緒同步輔助類之訊號量(semaphore)
1.訊號量的概念: 訊號量是一種計數器,用來保護一個或者多個共享資源的訪問,它是併發程式設計的一種基礎工具,大多數程式語言都提供了這個機制。 2、訊號量控制執行緒訪問流程: 如果執行緒要訪問一個共享資源,它必須先獲得訊號量。如果訊號量的內部計數器大於0,訊號量將減1,然後
java基礎之變量和常量、類型轉換
聲明 src .cn ble .com 不能 需要 bsp 字母 一、 變量 變量是可改變的量,每賦個值便會開辟一個新內存地址。 1、首先,變量需要一個聲明,例如:int a,這個a也可以當作是一個標簽,它指向了一個內存地址,這個地址是屬於int類型的套餐,可以通過
Java執行緒之訊號量
計數訊號量用來控制同時訪問某個特定資源的運算元量,或者同時執行某個指定操作的數量。計數訊號量還可以用來實現某種資源池,或者對容器施加邊界。 Semaphore中管理者一組虛擬的許可,許可的數量可通過建構函式來指定。在互相操作時可以首先獲得許可(只要還有剩餘的許可),並在使用以後釋放許可。
Java併發之sleep() 和 wait(n) 、 wait() 的區別
sleep() 和 wait(n) 、 wait() 的區別 答: sleep 方法:是 Thread 類的靜態方法,當前執行緒將睡眠 n 毫秒,執行緒進入阻塞狀態。當睡眠時間到了,會接觸阻塞,進入可
Linux程序間通訊之訊號量(semaphore)、訊息佇列(Message Queue)和共享記憶體(Share Memory)
System V 程序通訊方式:訊號量(semaphore)、訊息佇列(Message Queue)和共享記憶體(Share Memory) 訊號量 訊號量(semaphore)實際是一個整數,它的值由多個程序進行測試(test)和設定(set)。就每個程序所關心的測試和
[滄海拾遺]java併發之CountDownLatch、Semaphore和CyclicBarrier
JAVA併發包中有三個類用於同步一批執行緒的行為,分別是CountDownLatch、Semaphore和CyclicBarrier。 CountDownLatch CountDownLatch是一個計數器閉鎖,主要的功能就是通過await()方法來阻塞住當前執行緒,
linux下多執行緒同步機制之訊號量、互斥量、讀寫鎖、條件變數
之前有寫過類似的部落格,這東西不用老忘,現在又有更清晰的理解了。 一、訊號量 編譯時候加入-lrt 訊號量最基本的兩個操作就是PV操作:P()操作實現訊號量減少,V()操作實現訊號量的增加 訊號量的值取決於訊號量的型別,訊號量的型別有多種: (1)二進位制訊號量:0與1.
Java入門 之 變量和常量
java標識符 float clas 數據類型 interface 入門 整數 布爾型 類型轉換 1. Java中的關鍵字 2. 認識Java標識符 3. 變量是什麽 4. 如何命名Java變量 5. Java中的數據類型 5.1 基本數據類型 - 數值型:
Java 基礎 之 變量
Java 基礎 之 變量原鏈接 : http://www.verejava.com/?id=1699255231918 /* 註意: 1. 變量命名不允許重復 2. 變量的命名規則: 以字符,下劃線,$ ,數字組成,並且開始首字母必須為 字符,下滑線或$ 不能是數字 */ public class TestV
java基礎之 變量
關鍵字 F5 val 基礎 ack idt width align 100% 變量是一個內存位置的名稱。 1、成員變量(實例變量,屬性) 成員變量就是類中的屬性,當創建對象的時候,每個對象都有一份屬性。一個對象中的屬性就是成員變量。 2、本地變量(局部變量)
linux 多執行緒之訊號量 sem_init
1. 什麼是訊號量 linux sem 訊號量是一種特殊的變數,訪問具有原子性, 用於解決程序或執行緒間共享資源引發的同步問題。 使用者態程序對 sem 訊號量可以有以下兩種操作: 等待訊號量 當訊號量值為 0 時,程式等待;當訊號量值大於 0 時,訊號量減 1,程式
java 併發之CountDownLatch
概述 CountDownLatch是一個用來控制併發的很常見的工具,它允許一個或者多個執行緒等待其他的執行緒執行到某一操作,比如說需要去解析一個excel的資料,為了更快的解析則每個sheet都使用一個執行緒去進行解析,但是最後的彙總資料的工作則需要等待每個sheet的解析工作完成之後才
java 併發 之 Interrupt()
interrupt簡述 interrupt() 方法只是改變中斷狀態而已,它不會中斷一個正在執行的執行緒。這一方法實際完成的是,給受阻塞的執行緒發出一箇中斷訊號,這樣受阻執行緒就得以退出阻塞的狀態。 更確切的說,如果執行緒被Object.wait, Thread.join和Thread.
java併發之 CopyOnWriteArrayList的原理和使用方法
描述 CopyOnWriteArrayList:CopyOnWriteArrayList這是一個ArrayList的執行緒安全的變體,其原理大概可以通俗的理解為:初始化的時候只有一個容器,很常一段時間,這個容器資料、數量等沒有發生變化的時候,大家(多個執行緒),都是讀取(假設這段時間裡只
java 併發之LockSupport
LockSupport LockSupport提供park()和unpark()方法實現阻塞執行緒和解除執行緒阻塞,實現的阻塞和解除阻塞是基於”許可(permit)”作為關聯,permit相當於一個訊號量(0,1),預設是0. 執行緒之間不再需要一個Object或者其它變數來儲存狀態,不
java 併發之CyclicBarrier
什麼是CyclicBarrier 可以理解為迴圈柵欄,柵欄就是一種障礙物.假如我們將計數器設定為10,那麼湊齊第一批10個執行緒後,計數器就會歸零,然後接著湊齊下一批10個執行緒,這就是迴圈柵欄的含義. 構造器: public CyclicBarrier(int parties,
java 併發之 Semphore
簡介 Semaphore(訊號量)是用來控制同時訪問特定資源的執行緒數量,它通過協調各個執行緒,以保證合理的使用公共資源。很多年以來,我都覺得從字面上很難理解Semaphore所表達的含義,只能把它比作是控制流量的紅綠燈,比如XX馬路要限制流量,只允許同時有一百輛車在這條路上行使,其他的