欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java基于Semaphore构建阻塞对象池

程序员文章站 2022-07-04 18:38:43
java中使用semaphore构建阻塞对象池semaphore是java 5中引入的概念,叫做计数信号量。主要用来控制同时访问某个特定资源的访问数量或者执行某个操作的数量。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<t> {

  private final set<t> set;
  private final semaphore sem;

  public semaphoreusage(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;
  }
}

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

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

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