• 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<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

    更多内容请访问 flydean的博客

  • 相关阅读:
    2013-3 阿里性能稳定性沙龙
    8种Nosql数据库系统对比
    百度技术笔记之2013-1
    百度技术沙龙之2013-2&3
    【消息队列MQ】各类MQ比较
    Unity3D 游戏引擎之C#使用Socket与HTTP连接server数据传输包
    android的ndk学习(1)
    杭电 3555 Bomb
    FaceBook开源库Fresco
    SDUTOJ 2476Period
  • 原文地址:https://www.cnblogs.com/flydean/p/12680260.html
Copyright © 2020-2023  润新知