阅读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开发入门环境搭建