1. 程式人生 > >23-Semaphore 訊號量

23-Semaphore 訊號量

  1. Semaphore 訊號量
    1. 使用場景

經常用於限制獲取某種資源的執行緒數量。

比如說操場上有5個跑道,一個跑道一次只能有一個學生在上面跑步,一旦所有跑道在使用,那麼後面的學生就需要等待,直到有一個學生不跑了。

    1. 方法:
  • Semaphore semaphore = new Semaphore(2);

構造器,用於設定當前最大可執行的執行緒的個數,當前預設為非公平模式。如上例中的跑道個數。

  • Semaphore semaphore = new Semaphore(2, boolean fair);

構造器,以公平模式/非公平模式執行構造器。

  • semaphore.acquire();

獲取訊號量。即當前執行緒佔有鎖;同時內部會使state--,直到該執行緒中呼叫semaphore.release()時才釋放鎖。

  • semaphore.release();

釋放訊號量。即當前執行緒釋放鎖;同時內部會使state++,此時一個處於阻塞狀態的執行緒可以獲取鎖。

 

    1. 原始碼分析
      1. 構造器new Semaphore(2, boolean fair);

final Sync sync = fair ? new FairSync(permits) : new NonfairSync(permits);

最終呼叫setState(permits)方法,即設定AQS中的資源,就是許可證的數量。

      1. acquire()

Semaphore存在FairSync,NonfairSync兩種不同的模式。

FairSync會首先判斷當前佇列中有沒有執行緒在等待,如果有,就老老實實進入到等待佇列;

NonfairSync先試一把,說不定就恰好獲得了一個許可,這樣就可以插隊了;獲取失敗則加入佇列。

      1. release()

使用CAS協議釋放資源,重置waitStatus--,並喚醒下一個節點。

 

    1. Demo使用案例
    1. 原始碼:

模擬20輛車,先後進入2個停車場的邏輯。

    1. 執行結果

一個執行緒釋放鎖時,會有一個執行緒獲取鎖

 

多執行緒學習大綱:https://mp.csdn.net/postedit/84768644