美文网首页
java并发-Semaphore(计数信号量)

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

作者: MJLDG | 来源:发表于2019-12-28 19:17 被阅读0次

    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(计数信号量)

          本文链接:https://www.haomeiwen.com/subject/bfwdoctx.html