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; } }
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于