java并发-Semaphore(计数信号量)

Semaphore,juc下的同步工具类,简称计数信号量。
常用于控制同时访问共享资源的线程数量,和Synchronized,ReentrantLock不同,
这些都是独占锁,每次只允许一条线程访问共享资源。
但是Semaphore却可以允许指定数量的线程同时进入共享资源。

  public static void main(String[] args) {
        //每次可以3条线程同时访问共享资源
        Semaphore semaphore = new Semaphore(3);
        int size = 9;
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        for (int i = 1; i <= size; i++) {
            final int temp = i;
            executorService.execute(() -> {
                try {
                    semaphore.acquire();
                    System.err.println(Thread.currentThread().getName() + "---" + temp+"--"+ new Date());
                    Thread.sleep(1000L);
                    semaphore.release();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
        executorService.shutdown();
    }

输出如下

pool-1-thread-1---1--Fri Dec 27 17:35:44 CST 2019
pool-1-thread-2---2--Fri Dec 27 17:35:44 CST 2019
pool-1-thread-3---3--Fri Dec 27 17:35:44 CST 2019
pool-1-thread-5---5--Fri Dec 27 17:35:45 CST 2019
pool-1-thread-1---6--Fri Dec 27 17:35:45 CST 2019
pool-1-thread-4---4--Fri Dec 27 17:35:45 CST 2019
pool-1-thread-3---8--Fri Dec 27 17:35:46 CST 2019
pool-1-thread-2---7--Fri Dec 27 17:35:46 CST 2019
pool-1-thread-4---9--Fri Dec 27 17:35:46 CST 2019

通过分析也可以发现每次也最多只有三条线程同时访问。

你可能感兴趣的:(java并发-Semaphore(计数信号量))