1. 程式人生 > >Java併發之訊號量、倒計數門閂、迴圈柵欄和LockSupport

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併發CountDownLatchSemaphoreCyclicBarrier

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馬路要限制流量,只允許同時有一百輛車在這條路上行使,其他的