信號量 (Counting Semaphore)
計(jì)數(shù)信號量用來控制同時(shí)訪問某個(gè)特定資源的操作數(shù)量。也可以用來實(shí)現(xiàn)某種資源池或者對容器施加邊界斯入。
Semaphore 中管理著一組虛擬的 permit砂碉,其數(shù)量通過構(gòu)造函數(shù)來指定。在執(zhí)行操作時(shí)可以先獲得 permit刻两,并在使用以后釋放 permit增蹭。如果沒有,那么 acquire() 將阻塞直到有 permit(或者直到被中斷或超時(shí))磅摹。release() 方法將返回一個(gè) permit 給信號量滋迈。
二值信號量霎奢,也就是初始值為1的 Semaphore”樱可以用作互斥體(mutex)幕侠,并具備不可重入的加鎖語意:誰擁有這個(gè)唯一的permit,誰就擁有了互斥鎖赔退。
Semaphore 可以用于實(shí)現(xiàn)資源池橙依,例如數(shù)據(jù)庫連接池。
Semaphore 可以將任何一種容器變成有界容器硕旗,例如:
public class BoundedHasSet<T> {
private final Set<T> set;
private final Semaphore semaphore;
public BoundedHasSet(int bound) {
this.set = Collections.synchronizedSet(new HashSet<T>());
this.semaphore = new Semaphore(bound);
}
public boolean add(T item) throws InterruptedException {
semaphore.acquire();
boolean wasAdded = false;
try {
wasAdded = set.add(item);
return wasAdded;
} finally {
if (!wasAdded) {
semaphore.release();
}
}
}
public boolean remove(Object obj) {
boolean wasRemoved = set.remove(obj);
if (wasRemoved) {
semaphore.release();
}
return wasRemoved;
}
}