`
buzhucele
  • 浏览: 327397 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java同步例子之信号量(Semaphore)

    博客分类:
  • java
阅读更多
信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。
package concurrent;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.Semaphore;

/**
 * 通过以下两种方式获得许可
 * acquire() 
 * tryAcquire()
 * @author user
 *
 */
public class SemaphoreTest {
	
	private final Set<Integer> set;
	
	private final Semaphore sem;
	
	public SemaphoreTest(int bound){
		this.set = Collections.synchronizedSet(new HashSet<Integer>());
		sem = new Semaphore(bound);		
	}
	
	public boolean add(Integer o) throws InterruptedException{
		sem.acquire(); //如果信号量已被用光阻塞
		boolean wasAdded = false;
		try{
			wasAdded = set.add(o);
			return wasAdded;
		} finally {
			if(!wasAdded){
				sem.release();
			}
		}
	}
	
	public boolean addNoAwait(Integer o) throws InterruptedException{
		boolean wasAdded = false;
		if(sem.tryAcquire()){			
			try{
				wasAdded = set.add(o);
			} finally {
				if(!wasAdded){
					sem.release();
				}
			}
		}
		return wasAdded;
	}
	
	public boolean remove (Integer o){
		boolean wasRemoved = set.remove(o);
		if(wasRemoved){
			sem.release();
		}
		return wasRemoved;
	}

	/**
	 * @param args
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException {
		SemaphoreTest test = new SemaphoreTest(5);
		for(int i = 0; i < 10; i++){
//			System.err.println("add " + i + "=" +test.add(i));
			System.err.println("add " + i + "=" +test.addNoAwait(i));
		}
	}

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics