23-Semaphore 訊號量
阿新 • • 發佈:2018-12-05
- Semaphore 訊號量
- 使用場景
經常用於限制獲取某種資源的執行緒數量。
比如說操場上有5個跑道,一個跑道一次只能有一個學生在上面跑步,一旦所有跑道在使用,那麼後面的學生就需要等待,直到有一個學生不跑了。
-
- 方法:
- Semaphore semaphore = new Semaphore(2);
構造器,用於設定當前最大可執行的執行緒的個數,當前預設為非公平模式。如上例中的跑道個數。
- Semaphore semaphore = new Semaphore(2, boolean fair);
構造器,以公平模式/非公平模式執行構造器。
- semaphore.acquire();
獲取訊號量。即當前執行緒佔有鎖;同時內部會使state--,直到該執行緒中呼叫semaphore.release()時才釋放鎖。
- semaphore.release();
釋放訊號量。即當前執行緒釋放鎖;同時內部會使state++,此時一個處於阻塞狀態的執行緒可以獲取鎖。
-
- 原始碼分析
- 構造器new Semaphore(2, boolean fair);
- 原始碼分析
final Sync sync = fair ? new FairSync(permits) : new NonfairSync(permits);
最終呼叫setState(permits)方法,即設定AQS中的資源,就是許可證的數量。
-
-
- acquire()
-
Semaphore存在FairSync,NonfairSync兩種不同的模式。
FairSync會首先判斷當前佇列中有沒有執行緒在等待,如果有,就老老實實進入到等待佇列;
NonfairSync先試一把,說不定就恰好獲得了一個許可,這樣就可以插隊了;獲取失敗則加入佇列。
-
-
- release()
-
使用CAS協議釋放資源,重置waitStatus--,並喚醒下一個節點。
-
- Demo使用案例
-
- 原始碼:
模擬20輛車,先後進入2個停車場的邏輯。
-
- 執行結果
一個執行緒釋放鎖時,會有一個執行緒獲取鎖