Java信号量_Semaphorejava
计数信号量(Counting Semaphore)用来控制同时访问某个特定资源的操做数量,或者同时执行某个指定操做的数量。计数信号量还能够用来实现某种资源池,或者对容器施加边界。函数
Semaphore中管理着一组虚拟的许可(permit),许可的初始数量可经过构造函数来指定。在执行操做时,能够首先得到许可(只要还有剩余的许可),并在使用之后释放许可。ui
若是没有许可,那么acquire将阻塞直到有许可(或者直到被中断或者操做超时)。release方法将返回一个许可给信号量。计算信号量的一种简化形式是二值信号量,即初始值为1的Semaphore。二值信号量能够用来作互斥体,并具有不可重入的加锁语义:谁拥有这个惟一的许可,谁就拥有了互斥锁。this
示例代码:spa
package com.lyx; import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.concurrent.Semaphore; public class BoundHashSet<T> { private final Set<T> set; private final Semaphore semaphore; public BoundHashSet(int bound) { this.set = Collections.synchronizedSet(new HashSet<T>()); this.semaphore = new Semaphore(bound); } public boolean add(T o) throws InterruptedException { this.semaphore.acquire(); boolean wasAdded = false; try { wasAdded = this.set.add(o); return wasAdded; } finally { if (!wasAdded) { this.semaphore.release(); } } } public boolean remove(Object o) { boolean wasRemoved = this.set.remove(o); if (wasRemoved) { this.semaphore.release(); } return wasRemoved; } }
=============END=============code