码迷,mamicode.com
首页 > 其他好文 > 详细

信号量Semaphore

时间:2019-10-02 00:29:07      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:数值   操作   current   util   原理   span   bst   remove   hid   

  Semaphore用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量。计数信号量还可以用来实现某种资源池,或者对容器施加边界。

  Semaphore可以用于实现资源池。例如数据库连接池。我们可以构造一个固定长度的资源池,当池为空时,请求资源将会失败,但你真正希望看到的行为是阻塞而不是失败,并且当池为非空时解除阻塞,如果将Semaphore的计数值初始化为池的大小,并在池中获取一个资源之前首先调用accquire方法获取一个许可,在将资源返回给池之后调用release释放许可,那么accquire将一直阻塞直到资源池不为空。

  Semaphore还可以将任何一种容器变成有界阻塞容器。

  有界缓冲类也是用Semaphore实现。

下面是自己实现一个简单HashSet的有界阻塞容器。

技术图片
package com.citi.test.mutiplethread.demo0503;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.Semaphore;

public class BoundedHashSet<T> {
    private final Set<T> set;
    private final Semaphore sem;
    public BoundedHashSet(int bound) {
        this.set = Collections.synchronizedSet(new HashSet<T>());
        this.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;
    }

    public Set<T> getSet() {
        return set;
    }
    
}
View Code

原理:

内部是用AQS框架实现的。

技术图片
private static final long serialVersionUID = -3222578661600680210L;
/** All mechanics via AbstractQueuedSynchronizer subclass */
private final Sync sync;

//获取信号量。 阻塞方法
public void acquire() throws InterruptedException {
    sync.acquireSharedInterruptibly(1);
}

//释放信号量
public void release() {
    sync.releaseShared(1);
}
View Code

 

信号量Semaphore

标签:数值   操作   current   util   原理   span   bst   remove   hid   

原文地址:https://www.cnblogs.com/liumy/p/11616360.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!