以下入門介紹是我以前在讀其他文獻時偶然遇到了,已經記不得原作者了
1. 信號量(Semaphore)
信號量就是一個停車場。
當前值是停車場裏還剩下多少個空車位。
最大值是停車場裏最多能容納多少個車位。
當汽車進入停車場時,首先要在門口排隊(sem_wait),得到進入許可後才能進入。
排隊順序原則上先到先得。
每進一輛車,停車場就少了1個停車位,即信號量當前值-1。
當前值爲0時,停車場停滿了,所有車不得進入統統在門口排隊等。
當一輛車離開後,釋放其所佔據的停車位(sem_post),信號量當前值+1
信號量值得到釋放後,如果門口有正在排隊的車,那麼就放進來,每放進來一個就重複前面的步驟。
2. 互斥鎖(Mutex)
Mutex就是廁所的隔間
門開着的時候誰都可以進
但是一次只能進一個人
進去後就從裏面鎖上門
廁所裏有人的時候其他人就要排隊等,直到裏面的人出來
1. 信號量(Semaphore)
信號量就是一個停車場。
當前值是停車場裏還剩下多少個空車位。
最大值是停車場裏最多能容納多少個車位。
當汽車進入停車場時,首先要在門口排隊(sem_wait),得到進入許可後才能進入。
排隊順序原則上先到先得。
每進一輛車,停車場就少了1個停車位,即信號量當前值-1。
當前值爲0時,停車場停滿了,所有車不得進入統統在門口排隊等。
當一輛車離開後,釋放其所佔據的停車位(sem_post),信號量當前值+1
信號量值得到釋放後,如果門口有正在排隊的車,那麼就放進來,每放進來一個就重複前面的步驟。
2. 互斥鎖(Mutex)
Mutex就是廁所的隔間
門開着的時候誰都可以進
但是一次只能進一個人
進去後就從裏面鎖上門
廁所裏有人的時候其他人就要排隊等,直到裏面的人出來
作者:Chen Moore
鏈接:https://www.zhihu.com/question/40562993/answer/87204567
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
以下屬於收藏轉載,侵刪,出處:http://outofmemory.cn/code-snippet/2477/JAVA-xinhaoliang-Semaphore-usage
操作系統的信號量是個很重要的概念,在進程控制方面都有應用。Java 併發庫 的Semaphore 可以很輕鬆完成信號量控制,Semaphore可以控制某個資源可被同時訪問的個數,acquire()獲取一個許可,如果沒有就等待,而release()釋放一個許可。比如在Windows下可以設置共享文件的最大客戶端訪問個數。
Semaphore維護了當前訪問的個數,提供同步機制,控制同時訪問的個數。在數據結構中鏈表可以保存“無限”的節點,用Semaphore可以實現有限大小的鏈表。另外重入鎖ReentrantLock也可以實現該功能,但實現上要負責些,代碼也要複雜些。
下面的Demo中申明瞭一個只有5個許可的Semaphore,而有20個線程要訪問這個資源,通過acquire()和release()獲取和釋放訪問許可。
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class TestSemaphore { public static void main(String[] args) { // 線程池 ExecutorService exec = Executors.newCachedThreadPool(); // 只能5個線程同時訪問 final Semaphore semp = new Semaphore(5); // 模擬20個客戶端訪問 for (int index = 0; index < 20; index++) { final int NO = index; Runnable run = new Runnable() { public void run() { try { // 獲取許可 semp.acquire(); System.out.println("Accessing: " + NO); Thread.sleep((long) (Math.random() * 10000)); // 訪問完後,釋放 semp.release(); } catch (InterruptedException e) { } } }; exec.execute(run); } // 退出線程池 exec.shutdown(); } }
運行結果類似如下:
Accessing: 0 Accessing: 1 Accessing: 3 Accessing: 2 Accessing: 4 Accessing: 6 Accessing: 8 Accessing: 5 Accessing: 7 Accessing: 9 Accessing: 11 Accessing: 10 Accessing: 13 Accessing: 12 Accessing: 14 Accessing: 15 Accessing: 16 Accessing: 17 Accessing: 19 Accessing: 18