Semaphore

Semaphore

Semaphore當前在多線程環境下被擴放使用,操作系統的信號量是個很重要的概念,在進程控制方面都有應用。Java 併發庫 的Semaphore 可以很輕鬆完成信號量控制,Semaphore可以控制某個資源可被同時訪問的個數,通過 acquire() 獲取一個許可,如果沒有就等待,而 release() 釋放一個許可。比如在Windows下可以設置共享文件的最大客戶端訪問個數。

Semaphore實現的功能就類似廁所有5個坑,假如有10個人要上廁所,那麼同時只能有多少個人去上廁所呢?同時只能有5個人能夠佔用,當5個人中 的任何一個人讓開後,其中等待的另外5個人中又有一個人可以佔用了。另外等待的5個人中可以是隨機獲得優先機會,也可以是按照先來後到的順序獲得機會,這取決於構造Semaphore對象時傳入的參數選項。單個信號量的Semaphore對象可以實現互斥鎖的功能,並且可以是由一個線程獲得了“鎖”,再由另一個線程釋放“鎖”,這可應用於死鎖恢復的一些場合。

Semaphore維護了當前訪問的個數,提供同步機制,控制同時訪問的個數。在數據結構中鏈表可以保存“無限”的節點,用Semaphore可以實現有限大小的鏈表。另外重入鎖 ReentrantLock 也可以實現該功能,但實現上要複雜些。

Semaphore(0)

代碼

new Thread() {
    @Override
    public void run() {
        super.run();
        try {
            Log.d("silion", "_accountCheckSemaphore acquire start");
            _accountCheckSemaphore.acquire();
            Log.d("silion", "_accountCheckSemaphore acquire finish");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}.start();

new Thread() {
    @Override
    public void run() {
        super.run();
        for (int i = 0; i < 3; i++) {
            Log.d("silion", "waiting : " + 1000 * (i+1));
            SystemClock.sleep(1000);
        }
        Log.d("silion", "_accountCheckSemaphore release");
        _accountCheckSemaphore.release();
    }
}.start();

打印結果

silion: _accountCheckSemaphore acquire start
silion: waiting : 1000
silion: waiting : 2000
silion: waiting : 3000
silion: _accountCheckSemaphore release
silion: _accountCheckSemaphore acquire finish
發佈了41 篇原創文章 · 獲贊 8 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章