Multi-Th:同步工具-信号量

信号量 (Counting Semaphore)

计数信号量用来控制同时访问某个特定资源的操作数量。也可以用来实现某种资源池或者对容器施加边界。

Semaphore 中管理着一组虚拟的 permit,其数量通过构造函数来指定。在执行操作时可以先获得 permit,并在使用以后释放 permit。如果没有,那么 acquire() 将阻塞直到有 permit(或者直到被中断或超时)。release() 方法将返回一个 permit 给信号量。

二值信号量,也就是初始值为1的 Semaphore。可以用作互斥体(mutex),并具备不可重入的加锁语意:谁拥有这个唯一的permit,谁就拥有了互斥锁。

Semaphore 可以用于实现资源池,例如数据库连接池。

Semaphore 可以将任何一种容器变成有界容器,例如:

public class BoundedHasSet {
    private final Set set;
    private final Semaphore semaphore;
    
    public BoundedHasSet(int bound) {
        this.set = Collections.synchronizedSet(new HashSet());
        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;
    }
}

你可能感兴趣的:(Multi-Th:同步工具-信号量)