《并发编程》--11.允许多个线程同时访问的信号量Semaphpre

信号量为多线程协作提供了更为强大的控制方法。广义上说,信号量是对锁的拓展。无论是内部所synchronized还是重入锁ReentrantLock,一次都只允许一个线程访问一块资源,而信号量却可以指定多个线程数,同时访问一个资源。信号量主要提供一下构造函数;

  public Semaphore(int permits) {
        sync = new NonfairSync(permits);
    }
    public Semaphore(int permits, boolean fair) {
        sync = fair ? new FairSync(permits) : new NonfairSync(permits);
    }

在构造信号量对象时,必须指定信号量的准入数permits,即同时访问的临界区数量。fair是指定是否公平

以下一个简单的demo,供参考

public class semapDemo implements Runnable {
	final Semaphore semp = new Semaphore(5); //声明信号量 5个准入数

	@Override
	public void run() {
		try {
			semp.acquire(); 
			Thread.sleep(2000); //临界区     模拟耗时操作
			System.out.println(Thread.currentThread().getId()+": 完成!!!");
			semp.release(); //释放信号量,必须有,
			                //如果发生了信号量泄露(申请了没有释放,进入临界区的线程数会越来越少)
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		ExecutorService es = Executors.newFixedThreadPool(20);
		final semapDemo demo  = new semapDemo();
		for(int i=0;i<20;i++){
			es.submit(demo);
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值