java Semaohore 信号量:用于 控制同时访问某个资源的操作数量。
Semaphore 管理着一组许可(primit),在构造函数中指定,在执行操作时首先获得许可(只要还有),使用后释放。
名词:信号量(相当于连接池),许可(相当于连接池中的一个连接)
主要方法:
acquire:获得许可(如果没有许可,一直阻塞)
release:释放许可
使用场景:连接池、使用 Semaphore 将容器变为有界阻塞容器
// 使用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>());
sem = new Semaphore(bound);
}
public boolean add(T o) throws InterrupedException{
// add前先获取许可,如果没有许可则一直阻塞
sem.acquire();
boolean wasAdded = flase;
try{
// 添加成功 返回 true
wasAssed = set.add(o);
}finally{
// 没有添加成功,释放许可
if(!wasAdded){
sem.release();
}
}
}
public boolean remove(Object o){
boolean wasRemove = set.remove(o);
if(wasRemove){
// 如果remove成功,释放一个许可给信号量
sem.release();
}
return wasRemove;
}
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于