Java并发编程:Semaphore

这篇具有很好参考价值的文章主要介绍了Java并发编程:Semaphore。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Semaphore

信号量可以控制线程的并发数量

通常用于那些资源有明确访问数量限制的场景,常用于限流 。

使用 Semaphore先调用acquire()获取,然后通过try ... finally保证在finally中释放。

Semaphore常用方法说明

  • acquire()
    获取一个令牌,在获取到令牌、或者被其他线程调用中断之前线程一直处于阻塞状态。

  • acquire(int permits)
    获取一个令牌,在获取到令牌、或者被其他线程调用中断、或超时之前线程一直处于阻塞状态。

  • acquireUninterruptibly()
    获取一个令牌,在获取到令牌之前线程一直处于阻塞状态(忽略中断)。

  • tryAcquire()
    尝试获得令牌,返回获取令牌成功或失败,不阻塞线程。

  • tryAcquire(long timeout, TimeUnit unit)
    尝试获得令牌,在超时时间内循环尝试获取,直到尝试获取成功或超时返回,不阻塞线程。

  • release()
    释放一个令牌,唤醒一个获取令牌不成功的阻塞线程。

面试常考题目交替打印ABC

    @Test
    public void testSemaphore() {
        int i1 = 100;
        Semaphore semaphore1 = new Semaphore(1, true);
        Semaphore semaphore2 = new Semaphore(0);
        Semaphore semaphore3 = new Semaphore(0);
        new Thread(() -> {
            try {
                for (int i = 0; i < i1; i++) {
                    semaphore1.acquire();
                    System.out.print("A");
                    semaphore2.release();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        new Thread(() -> {
            try {
                for (int i = 0; i < i1; i++) {
                    semaphore2.acquire();
                    System.out.print("B");
                    semaphore3.release(1);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        new Thread(() -> {
            try {

                for (int i = 0; i < i1; i++) {
                    semaphore3.acquire();
                    System.out.println("C");
                    semaphore1.release(1);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }

Semaphore 使用及原理
文章来源地址https://www.toymoban.com/news/detail-523942.html

到了这里,关于Java并发编程:Semaphore的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java-并发编程-进阶篇

    在上一篇幅中对并发编程进行了简单介绍:并发与并行,进程与线程,以及并发编程的简单代码 但是在企业中往往并不能解决实际问题,例如: 1.synchronized在企业开发中会大大降低系统的性能,有什么解决方式,或者其他的替代方案 2.当线程被创建并启动以后,它既不

    2024年02月06日
    浏览(64)
  • Java并发编程-volatile

    volatile 是 java 虚拟机提供的一种轻量级的同步机制,它有三个重要的特性: 保证可见性 不保证原子性 禁止指令重排 要理解这三个特性,就需要对 JMM (JAVA内存模型)有一定的了解才行。 主要解决的问题: JVM中,每个线程都会存在本地内存,本地内存是公共内存的副本,各

    2024年02月06日
    浏览(42)
  • Java并发编程实战

    2023年06月19日
    浏览(51)
  • Java并发编程面试题

    目录 一、线程、进程、程序 二、线程状态  三、线程的七大参数 四、线程有什么优缺点? 五、start 和 run 方法有什么区别? 六、wait 和 sleep的区别? 七、lock与synchronized的区别 八、Volatile是线程安全的吗?底层原理是什么? 九、synchronized作用和底层原理? 十一、Thre

    2024年02月12日
    浏览(59)
  • Java使用redis-Redis是并发安全的吗?

    大家都清楚,Redis 是一个开源的高性能键值对存储系统,被开发者广泛应用于缓存、消息队列、排行榜、计数器等场景。 由于其高效的读写性能和丰富的数据类型,Redis 受到了越来越多开发者的青睐。然而,在并发操作下,Redis 是否能够保证数据的一致性和安全性呢?接下来

    2024年02月11日
    浏览(72)
  • 【面试】java并发编程面试题

    java并发面试题 https://javaguide.cn/home.html java基础面试题 https://blog.csdn.net/jackfrued/article/details/44921941 java集合面试题 https://javaguide.cn/java/collection/java-collection-questions-01.html javaIO面试题 https://javaguide.cn/java/io/io-basis.html JVM面试题 https://javaguide.cn/java/jvm/jvm-garbage-collection.html 计算机网络

    2024年01月21日
    浏览(48)
  • java并发编程:LinkedBlockingQueue详解

    在集合框架里,想必大家都用过ArrayList和LinkedList,也经常在面试中问到他们之间的区别。ArrayList和ArrayBlockingQueue一样,内部基于数组来存放元素,而LinkedBlockingQueue则和LinkedList一样,内部基于链表来存放元素。 LinkedBlockingQueue实现了BlockingQueue接口,这里放一张类的继承关系图

    2024年02月08日
    浏览(63)
  • java并发编程 LinkedBlockingDeque详解

    java 并发编程系列文章目录 首先queue是一种数据结构,一个集合中,先进后出,有两种实现的方式,数组和链表。从尾部追加,从头部获取。Deque是两端都可以添加,且两端都可以获取,所以它的方法会有一系列的Last,Frist语义,添加或获取等操作会指明哪个方向的,这也是

    2024年02月10日
    浏览(53)
  • java并发编程:ArrayBlockingQueue详解

    ArrayBlockingQueue 顾名思义:基于数组的阻塞队列。数组是要指定长度的,所以使用 ArrayBlockingQueue 时必须指定长度,也就是它是一个有界队列。它实现了 BlockingQueue 接口,有着队列、集合以及阻塞队列的所有方法。 ArrayBlockingQueue 是线程安全的,内部使用 ReentrantLock 来保证。A

    2024年02月08日
    浏览(59)
  • 01.java并发编程面试宝典

    谈谈什么是线程池 线程池和数据库连接池非常类似,可以统一管理和维护线程,减少没有必要的开销。 因为频繁的开启线程或者停止线程,线程需要从新被 cpu 从就绪到运行状态调度,需要发生上下文切换 实际开发项目中 禁止自己 new 线程。必须使用线程池来维护和创建线

    2024年02月03日
    浏览(107)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包