关闭

semaphore信号灯

389人阅读 评论(0) 收藏 举报
//Semaphore可以维护当前访问自身的线程个数,并提供了同步机制。
//使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数。
//Semaphore实现的功能就类似厕所有5个坑,假如有十个人要上厕所,那么同时能有多少个人去上厕所呢?
//同时只能有5个人能够占用,当5个人中的任何一个人让开后,其中在等待的另外5个人中又有一个可以占用了。
//另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,
//这取决于构造Semaphore对象时传入的参数选项。
//单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,
//再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合
//注意,调用 acquire() 时无法保持同步锁,因为这会阻止将项返回到池中。
//信号量封装所需的同步,以限制对池的访问,这同维持该池本身一致性所需的同步是分开的。 
// semaphore本身在jdk的例子也很好,可以去看看
public class SemaphoreTest {
	public static void main(String[] args) {
		ExecutorService service = Executors.newCachedThreadPool();
		final  Semaphore sp = new Semaphore(3);
		for(int i=0;i<10;i++){
			Runnable runnable = new Runnable(){
					public void run(){
					try {
						sp.acquire();
					} catch (InterruptedException e1) {
						e1.printStackTrace();
					}
					System.out.println("线程" + Thread.currentThread().getName() + 
							"进入,当前已有" + (3-sp.availablePermits()) + "个并发");
					try {
						Thread.sleep((long)(Math.random()*10000));
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("线程" + Thread.currentThread().getName() + 
							"即将离开");					
					sp.release();
					//下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元
					System.out.println("线程" + Thread.currentThread().getName() + 
							"已离开,当前已有" + (3-sp.availablePermits()) + "个并发");					
				}
			};
			service.execute(runnable);			
		}
	}

}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:102233次
    • 积分:1728
    • 等级:
    • 排名:千里之外
    • 原创:56篇
    • 转载:58篇
    • 译文:1篇
    • 评论:17条
    最新评论