java7种对象池_Java基于Semaphore构建阻塞对象池

java中使用Semaphore构建阻塞对象池

Semaphore是java 5中引入的概念,叫做计数信号量。主要用来控制同时访问某个特定资源的访问数量或者执行某个操作的数量。

Semaphore中定义了一组虚拟的permits,通过获取和释放这些permits,Semaphore可以控制资源的个数。

Semaphore的这个特性可以用来构造资源池,比如数据库连接池等。

Semaphore有两个构造函数:

public Semaphore(int permits) {

sync = new NonfairSync(permits);

}

public Semaphore(int permits, boolean fair) {

sync = fair ? new FairSync(permits) : new NonfairSync(permits);

}

permits定义了许可资源的个数,而fair则表示是否支持FIFO的顺序。

两个比较常用的方法就是acquire和release了。

public void acquire() throws InterruptedException {

sync.acquireSharedInterruptibly(1);

}

public void release() {

sync.releaseShared(1);

}

其中acquire用来获取资源,release用来释放资源。

有了这两个特性, 我们看一下怎么使用Semaphore来定义一个一个有界容器。

我们可以将Semaphore初始化为容器池大小,并且在容器池获取资源时调用acquire,将资源返回给容器池之后再调用release。

我们看下面的一个实现:

public class SemaphoreUsage {

private final Set set;

private final Semaphore sem;

public SemaphoreUsage(int bound){

this.set = Collections.synchronizedSet(new HashSet());

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;

}

}

上面的例子我们定义了一个有界的synchronizedSet。 要注意一点是在add方法中,只有add成功之后才会调用release方法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值