一個計數信號量。從概念上講,信號量維護了一個許可集。如有必要,在許可可用前會阻塞每一個 acquire()
,然後再獲取該許可。每個
release()
添加一個許可,從而可能釋放一個正在阻塞的獲取者。但是,不使用實際的許可對象,Semaphore
只對可用許可的號碼進行計數,並採取相應的行動。
操作系統的信號量是個很重要的概念,在進程控制方面都有應用。Java 併發庫 的Semaphore 可以很輕鬆完成信號量控制,Semaphore可以控制某個資源可被同時訪問的個數,acquire()獲取一個許可,如果沒有就等待,而release()釋放一個許可。比如在Windows下可以設置共享文件的最大客戶端訪問個數。
public class Test<T> {
private final Set<T> set;
private final Semaphore semaphore;
Test(int i){
this.set=Collections.synchronizedSet(new HashSet<T> ());
this.semaphore=new Semaphore(i);
}
public boolean add(T t) throws InterruptedException{
semaphore.acquire();
Boolean wasAdded=false;
try {
wasAdded=set.add(t);
return wasAdded;
} finally {
if(!wasAdded)
semaphore.release();
}
}
}
多線程調用add方法Semaphore可以控制某個資源可被同時訪問的個數