Semaphore是什么

Semaphore通常我们叫它信号量,可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。

使用场景

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

Sempahore常用方法说明

acquire()
获取一个令牌,在获取到令牌、或者被其他线程调用中断之前线程一直处于阻塞状态。
​
acquire(int permits)
获取一个令牌,在获取到令牌、或者被其他线程调用中断、或超时之前线程一直处于阻塞状态。acquireUninterruptibly()
获取一个令牌,在获取到令牌之前线程一直处于阻塞状态(忽略中断)。tryAcquire()
尝试获得令牌,返回获取令牌成功或失败,不阻塞线程。
​
tryAcquire(long timeout, TimeUnit unit)
尝试获得令牌,在超时时间内循环尝试获取,直到尝试获取成功或超时返回,不阻塞线程。
​
release()
释放一个令牌,唤醒一个获取令牌不成功的阻塞线程。
​
hasQueuedThreads()
等待队列里是否还存在等待线程。
​
getQueueLength()
获取等待队列里阻塞的线程数。
​
drainPermits()
清空令牌把可用令牌数置为0,返回清空令牌的数量。
​
availablePermits()
返回可用的令牌数量。

例子

public static Semaphore semaphore = new Semaphore(5);public static void semaphore(){for (int i = 0; i < 100; i++) {Thread t = new Thread(() -> {try {if(semaphore.availablePermits() == 0){System.out.println("最多只能有5个人同时操作! Name:" + Thread.currentThread().getName());}semaphore.acquire();} catch (InterruptedException e) {e.printStackTrace();}try {System.out.println("操作中! Name:"+Thread.currentThread().getName());Thread.sleep(5000);System.out.println("操作结束! Name:" + Thread.currentThread().getName());} catch (InterruptedException e) {e.printStackTrace();}finally {semaphore.release();}},"T"+i+1);t.start();}}

Semaphore(信号量)相关推荐

  1. 线程 信号量 java_JAVA多线程-Semaphore信号量

    一.概述 Semaphore(信号量) 是一个线程同步结构,用于在线程间传递信号,以避免出现信号丢失,或者像锁一样用于保护一个关键区域,可以控制同时访问的线程个数,并且通过acquire()方法获取一 ...

  2. Java并发编程中级篇(一):使用Semaphore信号量进行并发控制

    2019独角兽企业重金招聘Python工程师标准>>> Semaphore是一个二进制信号量,只有0和1两个值.如果线程想要访问一个共享资源,它必须先获得信号量.如果信号量的内部计数 ...

  3. pthread-win32 semaphore信号量总结

    最近的多线程 想实现这样的功能: 多线程Socket获得的数据 对其进行某种处理FuncA,但是FuncA比较耗时,希望能够单独独立出来,这样 接受和处理数据分开,但是FuncA处理数据不能放入一个线 ...

  4. Java Semaphore 信号量

    Java Semaphore 信号量 Semaphore 是一种基于计数的信号量.它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞.S ...

  5. Linux 信号量 源码,一文读懂go中semaphore(信号量)源码

    运行时信号量机制 semaphore 前言 最近在看源码,发现好多地方用到了这个semaphore. 本文是在go version go1.13.15 darwin/amd64上进行的 作用是什么 下 ...

  6. Java并发编程笔记之Semaphore信号量源码分析

    JUC 中 Semaphore 的使用与原理分析,Semaphore 也是 Java 中的一个同步器,与 CountDownLatch 和 CycleBarrier 不同在于它内部的计数器是递增的,那 ...

  7. python并发编程之semaphore(信号量)_浅谈Python并发编程之进程(守护进程、锁、信号量)...

    前言:本博文是对Python并发编程之进程的知识延伸,主要讲解:守护进程.锁.信号量. 友情链接: 一.守护进程(daemon) 1.1 守护进程概念 首先我们都知道:正常情况下,主进程默认等待子进程 ...

  8. Linux系统编程:使用semaphore信号量和mutex互斥量实现多个生产者和消费者模型

    代码实现 如题,使用semaphore信号量和mutex互斥量实现多个生产者和消费者模型.本来是想只用信号量实现生产者消费者模型的,但是发现 只能在一个生产者和一个消费者之间,要在多个生产者和消费者模 ...

  9. 同步工具之Semaphore信号量

    Semaphore可以理解为信号量,用于控制资源能够被并发访问的线程数量,以保证多个线程能够合理的使用特定资源.Semaphore就相当于一个许可证,线程需要先通过acquire()方法获取该许可证, ...

  10. java控制并发数量_Java并发编程中级篇(二):使用Semaphore信号量进行多个资源并发控制...

    上一节中我们使用了Semaphore信号量保护共享资源,但是它只能保护一个共享资源,当我们需要同时保护多个共享资源的时候,我们只需要在创建信号量的时候使用new Semaphore(int)构造方法, ...

最新文章

  1. CODEVS-2018-反病毒软件-线段树
  2. php krsort重置索引,PHP数组处理函数举例
  3. mysql查询语句能否让一个字段不显示出来_天天写order by,你知道Mysql底层如何执行吗?
  4. php t double arrow,php – 语法错误,意外T_DOUBLE_ARROW
  5. 创业者必须要做一个超级现实的人
  6. mysql几种备份恢复_mysql多种备份与恢复方式一
  7. 出租车计费java_java算法_出租车计费
  8. 微信小程序下拉刷新功能--onPullDownRefresh
  9. 早年的一篇关于80286保护模式的文章
  10. 起步 —— 种一棵树最好的时间是十年前
  11. 前端模块化(CommenJS规范、ES6规范)
  12. pip 和 conda 什么区别?
  13. 计算机组成--PC和IP的区别
  14. Ubuntu下安装Python
  15. 雨听 | 英语作文作文万能句型
  16. Python之图形用户界面--GUI
  17. UEFI+GPT模式下安装win 10系统——生命不止,折腾不息
  18. 夏休回国游记--安阳
  19. 最新联想bios logo图_软路由神器 联想M720Q=250元,M920Q=350元 8代mini主机大跳水?...
  20. 蓝桥杯比赛时间在什么时候_梨树什么时候去枝最佳时间?

热门文章

  1. 实时荧光定量聚合酶链式反应和2-▲CT方法分析相关基因表达数据
  2. R语言与数据分析(8)-获取帮助
  3. 科研人专属微信红包封面免费送!速领
  4. Geoderma:南土所梁玉婷组-施用粪肥土壤中抗生素抗性基因和金属抗性基因的共存机制...
  5. Nature子刊 | 翟冰等造血干细胞移植中的肠道真菌菌群动态变化与临床结果分析(招聘博后、助研)...
  6. 浙大蒋超组招博后:环境暴露组和微生物组
  7. 蚂蚁森林合种计划(2020.11.14,7天有效,每周6更新)
  8. 生态统计学里的数据转化与标准化
  9. R语言笔记8:两个重要函数——用来分解数据框的split和用来查看对象的str
  10. 给不爱洗手找个理由——皮肤共生菌可以促进伤口愈合