hymn

忽有故人心头过,回首山河已是秋。

  menu
132 文章
0 浏览
3 当前访客
ღゝ◡╹)ノ❤️

java--Semaphore

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;
	}
}

标题:java--Semaphore
作者:hymn
地址:https://www.dxyhymn.com/articles/2020/05/29/1590722474034.html