信號量(java併發編程實戰5.5.4)

用途:用來控制同時訪問某個特定資源的操作數量,或者同時執行某個指定操作的數量。計數信號量可以用來實現某種資源池,或者對容器施加邊界。

 

public class SemaphoreTest<T> {
	private final Set<T> set;
	
	private final Semaphore sema;
	
	public SemaphoreTest(int bound){
		this.set = Collections.synchronizedSet(new HashSet<T>());
		this.sema = new Semaphore(bound);
	}
	
	public boolean add(T o) throws InterruptedException{
		sema.acquire();
		boolean wasAdded = false;
		try{
			wasAdded = set.add(o);
			return wasAdded;
		}finally{
			if(!wasAdded){
				sema.release();
			}
		}
	}
	
	public boolean remove(T o){
		boolean wasRemoved = set.remove(o);
		if(wasRemoved){
			sema.release();
		}
		return wasRemoved;
	}
	
	public static void main(String[] args) throws InterruptedException{
		int permits = 5;
		int elements = permits + 1;
		SemaphoreTest<Integer> test = new SemaphoreTest<Integer>(permits);
		for(int i = 0;i < elements; i++){
			test.add(i);
		}
	}
}


由於實際待添加的元素個數大於信號量所允許的數量,因此最後一次添加時,會一直阻塞。
發佈了111 篇原創文章 · 獲贊 62 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章