Semaphore

Semaphore 是一种基于技术的信号量。它可以设置一个阈值,然后多个线程竞争获取许可信号,完成后归还,超过阈值后,线程申请许可信号将会被阻塞。

常用方法

  1. Semaphore(int permits) 参数permits表示许可数目,即同时可以允许多少线程进行访问
  2. Semaphore(int permits, boolean fair) 多了一个参数fair表示是否是公平的,即等待时间越久的越先获取许可
  3. availablePermits() 返回此信号量中当前可用的许可数。
  4. acquire() 申请资源
  5. release() 释放资源
用法
Semaphore semp = new Semaphore(5);
try {  // 申请许可  semp.acquire();  try {  // 业务逻辑  } catch (Exception e) {  } finally {  // 释放许可  semp.release();  }
} catch (InterruptedException e) {  }
复制代码
案例

在公共厕所只有3个坑位,但是有10个人来上厕所。那怎么办? 假设10个人的编号分别为1-10,谁先到达,谁先抢到厕所坑位,谁就上厕所。一个坑位就是一个资源,只能一个人单独上厕所,一个线程使用一个资源,不能共享。

package cn.lvhaosir;import java.util.Random;
import java.util.concurrent.Semaphore;class Parent implements Runnable {String name;Semaphore semaphore;public Parent(String name, Semaphore semaphore) {super();this.name = name;this.semaphore = semaphore;}@Overridepublic void run() {// 获取到资源权限,减去1,坑位减1int availablePermits = semaphore.availablePermits();if(availablePermits > 0) {// 还有资源,还有坑位System.out.println(name+"还有坑位...");} else {// 没有资源了System.out.println(name+"怎么没有坑位了...");}try {// 申请资源,没有申请到的,就在此等待。有资源就继续向下执行。semaphore.acquire();// 模拟执行步骤和所需时间System.out.println(name+"终于进入坑位...");Thread.sleep(new Random().nextInt(1000));System.out.println(name+"上完了...");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {// 释放资源,坑位空出来了semaphore.release();}}
}
public class Test004 {public static void main(String[] args) throws InterruptedException {// 只有3个资源,3个坑位Semaphore semaphore = new Semaphore(3);for (int i = 1; i <= 10; i++) {new Thread(new Parent("第"+i+"个", semaphore)).start();;}}
}复制代码

转载请附上原文链接,有问题请留言,谢谢支持。

转载于:https://juejin.im/post/5b553d94e51d4517c5649ab6

Semaphore 类相关推荐

  1. 线程池,Volatile,原子性类AtomicInteger,乐观锁悲观锁,并发工具类Hashtable,ConcurrentHashMap类,Semaphore类

      目录 一.线程的状态 二.线程池 1.创建线程池的方式 1.1线程池-Executors默认线程池 1.2线程池-Executors创建指定上限的线程池 1.3线程池-ThreadPoolExec ...

  2. java并发编程工具类辅助类:CountDownLatch、CyclicBarrier和 Semaphore

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 以下 ...

  3. Java并发编程工具类:CountDownLatch、CyclicBarrier、Semaphore

    在jdk5中,java提供了一些非常有用的辅助工具类,包括CountDownLatch和CyclicBarrier(两者都可以实现线程之间的通信).Semaphore(控制方法被线程访问的数量),他们 ...

  4. Java并发编程之CountDownLatch、CyclicBarrier和Semaphore

    前言 本文为对CountDownLatch.CyclicBarrier.Semaphore的整理使用 CountDownLatch CountDownLatch类位于java.util.concurr ...

  5. 使用Java辅助类(CountDownLatch、CyclicBarrier、Semaphore)并发编程

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法 一.C ...

  6. Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore

    2019独角兽企业重金招聘Python工程师标准>>> 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarr ...

  7. [Python 多线程] Semaphore、BounedeSemaphore (十二)

    Semaphore 信号量,信号量对象内部维护一个倒计数器,每一次acquire都会减1,当acquire方法发现计数为0就阻塞请求的线程,直到其它线程对信号量release后,计数大于0,恢复阻塞的 ...

  8. Java高并发编程:同步工具类

    内容摘要 这里主要介绍了java5中线程锁技术以外的其他同步工具,首先介绍Semaphore:一个计数信号量.用于控制同时访问资源的线程个数,CyclicBarrier同步辅助类:从字面意思看是路障, ...

  9. java开发中的Mutex vs Semaphore

    先看一下stackoverflow上是怎么说的吧 原文地址:http://stackoverflow.com/questions/771347/what-is-mutex-and-semaphore- ...

最新文章

  1. awk - 模式扫描与处理语言
  2. Java基础提升篇:理解String 及 String.intern() 在实际中的应用
  3. shell 做加法运算_C语言探索之旅 | 第一部分第七课:运算那点事
  4. 龙之谷哪个服务器最多,龙之谷哪些服务器数据互通 龙之谷数据互通详情介绍...
  5. 再论PID,PID其实很简单。。。
  6. 地壳中元素含量排名记忆口诀_在地球46亿年的历史中,氮气始终是含量最高的气体,为什么?...
  7. 【Angular专题】——(2)【译】Angular中的ForwardRef
  8. 图解HTTP---------------------------------------------------3
  9. Axure RP 9.0.0.3687 正式版
  10. 欧姆龙OMRON PLC程序,威纶触摸屏螺丝机 配方程序。 用ST语言编写程序+威纶触摸屏程序
  11. 面试软件测试的时候,应届生怎么包装自己的简历?
  12. 金山词霸2003/2005/2006词典丢失的解决方法
  13. 简单讲解JSONP的跨域原理
  14. 掌财社寒山:彼得林奇最珍贵的股市投资理念
  15. 【drawio笔记】新增字体
  16. 登录 SharePoint Online
  17. 跨境电商战略发展中,流星汇聚分析未来跨境电商发展趋势
  18. html显示汉字音调,汉语拼音音调符号标法的规则
  19. android逻辑分辨率,手机ui设计dpi如何把握,看这3个平台各自的画布设置情况
  20. 软考备战:软考中级课程+参考资料

热门文章

  1. 全球及中国燃料乙醇行业产量规模及供需前景分析报告2021-2027年
  2. 中国光纤管理解决方案市场发展分析及十四五规划咨询建议报告2022年版
  3. 学习笔记27—python中numpy.ravel() 和 flatten()函数
  4. 面试题4:二维数组中的查找
  5. flask_requirements
  6. leetcode 27. Remove Element
  7. 【shell】shuf命令,随机排序
  8. duilib入门简明教程 -- VS环境配置(2) (转)
  9. flex属性值----弹性盒子布局
  10. c语言常用的字符串处理函数