信號量Semaphore

Semaphore 是一個計數信號量。從概念上講,信號量管理着一組虛擬的許可,許可的初始數量可通過構造函數來指定。在執行操作前要首先獲得許可,並在使用之後釋放許可。如果獲取不到許可,那麼 acquire()將阻塞直到有許可獲得爲止。每個 release() 將返回一個許可給信號量。。說白了,Semaphore是一個計數器,在計數器不爲0的時候對線程就放行,一旦達到0,那麼所有請求資源的新線程都會被阻塞。每一次請求一個許可都會導致計數器減少1,同樣每次釋放一個許可都會導致計數器增加1,一旦達到了0,新的許可請求線程將被掛起。緩存池也是使用此思想來實現的,比如鏈接池、對象池等。

下面是一個例子:

package net.jcip.examples;

import java.util.*;
import java.util.concurrent.*;
public class BoundedHashSet <T> {
    private final Set<T> set;
    private final Semaphore sem;

    public BoundedHashSet(int bound) {
        this.set = Collections.synchronizedSet(new HashSet<T>());
        sem = new Semaphore(bound);
    }

    public boolean add(T o) throws InterruptedException {
        sem.acquire();
        boolean wasAdded = false;
        try {
            wasAdded = set.add(o);
            return wasAdded;
        } finally {
            if (!wasAdded)
                sem.release();
        }
    }

    public boolean remove(Object o) {
        boolean wasRemoved = set.remove(o);
        if (wasRemoved)
            sem.release();
        return wasRemoved;
    }
}
使用信號量將任何一種容器變爲有界阻塞容器,在調用add方法向底層容器添加一個元素前,要先獲得一個許可,如果獲取不到,則阻塞,刪除掉一個元素時,則釋放一個許可返回給信號量。

發佈了73 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章