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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 下面最近发的一些并发编程的文章汇总,通过阅读这些文章大家再看大厂面试中的并发编程问题就没有那么头疼了。今天给大家总...
    架构师springboot阅读 3,911评论 0 3
  • layout: posttitle: 《Java并发编程的艺术》笔记categories: Javaexcerpt...
    xiaogmail阅读 11,112评论 1 19
  • 在Java5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile。 Ja...
    好好学习Sun阅读 3,440评论 0 3
  • Java SE 基础: 封装、继承、多态 封装: 概念:就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽...
    Jayden_Cao阅读 6,404评论 0 8
  • 闲来无事时,也爱养养花草。可惜我不是个有耐心的人,对花伺候的不周到,奈何花不生气,年年春天艳满盆。 这是白色的花...
    斋雨阅读 3,610评论 10 12