Java基于Semaphore构建阻塞对象池

网友投稿 241 2023-06-09

java基于Semaphore构建阻塞对象池

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

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

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

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

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

private final Semaphore sem;

public SemaphoreUsage(int bound){

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

sem= new Semaphore(bound);

http:// }

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成功之后才会调用releashttp://e方法。

本文的例子请参考https://github.com/ddean2009/learn-java-concurrency/tree/master/Semaphore

private final Semaphore sem;

public SemaphoreUsage(int bound){

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

sem= new Semaphore(bound);

http:// }

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成功之后才会调用releashttp://e方法。

本文的例子请参考https://github.com/ddean2009/learn-java-concurrency/tree/master/Semaphore

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java FutureTask类使用案例解析
下一篇: 为什么组装式应用需要前端框架 Angular
相关文章

 发表评论

暂时没有评论,来抢沙发吧~