閱讀455 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Java同步工具類——信號量

Semaphore可以用於實現資源池,例如數據庫連接池。我們可以構造一個固定長度的資源池,當池為空時,請求資源會失敗,但你真正希望的行為是阻塞而不是失敗,並且當池非空時解除阻塞。如果將Semaphore的初始值初始化為池的大小,並在池中獲取一個資源之前首先調用acquire獲取一個許可,在將資源返回給池之後調用release釋放許可,那麼acquire將一致阻塞直到資源池不為空。(在構造阻塞對象池時,一種更簡單的方法是使用阻塞隊列,不過阻塞隊列沒有計數信號量中“計數”的功能)。

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;
    }
}

最後更新:2017-04-12 17:30:52

  上一篇:go 2017/04/12 調用整基礎sitemap生成html別名登記項
  下一篇:go Python開發入門環境搭建