信号量Semaphore
Posted liumy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了信号量Semaphore相关的知识,希望对你有一定的参考价值。
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;
原理:
内部是用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);
以上是关于信号量Semaphore的主要内容,如果未能解决你的问题,请参考以下文章