Semaphore 类
Semaphore
Semaphore 是一种基于技术的信号量。它可以设置一个阈值,然后多个线程竞争获取许可信号,完成后归还,超过阈值后,线程申请许可信号将会被阻塞。
常用方法
- Semaphore(int permits) 参数permits表示许可数目,即同时可以允许多少线程进行访问
- Semaphore(int permits, boolean fair) 多了一个参数fair表示是否是公平的,即等待时间越久的越先获取许可
- availablePermits() 返回此信号量中当前可用的许可数。
- acquire() 申请资源
- 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 类相关推荐
- 线程池,Volatile,原子性类AtomicInteger,乐观锁悲观锁,并发工具类Hashtable,ConcurrentHashMap类,Semaphore类
目录 一.线程的状态 二.线程池 1.创建线程池的方式 1.1线程池-Executors默认线程池 1.2线程池-Executors创建指定上限的线程池 1.3线程池-ThreadPoolExec ...
- java并发编程工具类辅助类:CountDownLatch、CyclicBarrier和 Semaphore
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 以下 ...
- Java并发编程工具类:CountDownLatch、CyclicBarrier、Semaphore
在jdk5中,java提供了一些非常有用的辅助工具类,包括CountDownLatch和CyclicBarrier(两者都可以实现线程之间的通信).Semaphore(控制方法被线程访问的数量),他们 ...
- Java并发编程之CountDownLatch、CyclicBarrier和Semaphore
前言 本文为对CountDownLatch.CyclicBarrier.Semaphore的整理使用 CountDownLatch CountDownLatch类位于java.util.concurr ...
- 使用Java辅助类(CountDownLatch、CyclicBarrier、Semaphore)并发编程
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法 一.C ...
- Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore
2019独角兽企业重金招聘Python工程师标准>>> 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarr ...
- [Python 多线程] Semaphore、BounedeSemaphore (十二)
Semaphore 信号量,信号量对象内部维护一个倒计数器,每一次acquire都会减1,当acquire方法发现计数为0就阻塞请求的线程,直到其它线程对信号量release后,计数大于0,恢复阻塞的 ...
- Java高并发编程:同步工具类
内容摘要 这里主要介绍了java5中线程锁技术以外的其他同步工具,首先介绍Semaphore:一个计数信号量.用于控制同时访问资源的线程个数,CyclicBarrier同步辅助类:从字面意思看是路障, ...
- java开发中的Mutex vs Semaphore
先看一下stackoverflow上是怎么说的吧 原文地址:http://stackoverflow.com/questions/771347/what-is-mutex-and-semaphore- ...
最新文章
- awk - 模式扫描与处理语言
- Java基础提升篇:理解String 及 String.intern() 在实际中的应用
- shell 做加法运算_C语言探索之旅 | 第一部分第七课:运算那点事
- 龙之谷哪个服务器最多,龙之谷哪些服务器数据互通 龙之谷数据互通详情介绍...
- 再论PID,PID其实很简单。。。
- 地壳中元素含量排名记忆口诀_在地球46亿年的历史中,氮气始终是含量最高的气体,为什么?...
- 【Angular专题】——(2)【译】Angular中的ForwardRef
- 图解HTTP---------------------------------------------------3
- Axure RP 9.0.0.3687 正式版
- 欧姆龙OMRON PLC程序,威纶触摸屏螺丝机 配方程序。 用ST语言编写程序+威纶触摸屏程序
- 面试软件测试的时候,应届生怎么包装自己的简历?
- 金山词霸2003/2005/2006词典丢失的解决方法
- 简单讲解JSONP的跨域原理
- 掌财社寒山:彼得林奇最珍贵的股市投资理念
- 【drawio笔记】新增字体
- 登录 SharePoint Online
- 跨境电商战略发展中,流星汇聚分析未来跨境电商发展趋势
- html显示汉字音调,汉语拼音音调符号标法的规则
- android逻辑分辨率,手机ui设计dpi如何把握,看这3个平台各自的画布设置情况
- 软考备战:软考中级课程+参考资料
热门文章
- 全球及中国燃料乙醇行业产量规模及供需前景分析报告2021-2027年
- 中国光纤管理解决方案市场发展分析及十四五规划咨询建议报告2022年版
- 学习笔记27—python中numpy.ravel() 和 flatten()函数
- 面试题4:二维数组中的查找
- flask_requirements
- leetcode 27. Remove Element
- 【shell】shuf命令,随机排序
- duilib入门简明教程 -- VS环境配置(2) (转)
- flex属性值----弹性盒子布局
- c语言常用的字符串处理函数