信號量Semaphore的使用Demo

以下入門介紹是我以前在讀其他文獻時偶然遇到了,已經記不得原作者了

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章