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

来源:互联网 发布:网络管理视频教程下载 编辑:程序博客网 时间:2024/06/05 04:49

信号量为多线程协作提供了更为强大的控制方法。广义上说,信号量是对锁的拓展。无论是内部所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个准入数@Overridepublic 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);}}}



阅读全文
0 0