Multi-Th:同步工具-信号量
2016-12-17 本文已影响16人
甚了
信号量 (Counting Semaphore)
计数信号量用来控制同时访问某个特定资源的操作数量。也可以用来实现某种资源池或者对容器施加边界。
Semaphore 中管理着一组虚拟的 permit,其数量通过构造函数来指定。在执行操作时可以先获得 permit,并在使用以后释放 permit。如果没有,那么 acquire() 将阻塞直到有 permit(或者直到被中断或超时)。release() 方法将返回一个 permit 给信号量。
二值信号量,也就是初始值为1的 Semaphore。可以用作互斥体(mutex),并具备不可重入的加锁语意:谁拥有这个唯一的permit,谁就拥有了互斥锁。
Semaphore 可以用于实现资源池,例如数据库连接池。
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;
}
}