java并发编程之Semaphore
1.Semaphore主要方法
Semaphore(int permits):构造方法,创建具有给定许可数的计数信号量并设置为非公平信号量。
Semaphore(int permits,boolean fair):构造方法,当fair等于true时,创建具有给定许可数的计数信号量并设置为公平信号量。
void acquire():从此信号量获取一个许可前线程将一直阻塞。相当于一辆车占了一个车位。
void acquire(int n):从此信号量获取给定数目许可,在提供这些许可前一直将线程阻塞。比如n=2,就相当于一辆车占了两个车位。
void release():释放一个许可,将其返回给信号量。就如同车开走返回一个车位。
void release(int n):释放n个许可。
int availablePermits():当前可用的许可数。
2.示例
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。
比如一个火车站,只有3个售票点,所以要控制流量。假设有10个人要买票,现在只允许3个人同时去对应的售票点买票,只有这3个人中有人完成了购票操作,后面的人才能允许进入。
public class SemaphoreDemo extends Thread {private Semaphore semaphore;private String name;
public SemaphoreDemo(Semaphore semaphore, String name) {this.semaphore = semaphore;this.name = name;}
@Overridepublic void run() {//返回此信号量中当前可用的许可证数int i = semaphore.availablePermits();if (i > 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) {e.printStackTrace();} finally {//释放许可证semaphore.release();}}
public static void main(String[] args) {Semaphore s = new Semaphore(3);for (int i = 1; i <= 10; i++) {SemaphoreDemo semaphore = new SemaphoreDemo(s, i + "");semaphore.start();}}
}
在代码中,虽然有10个线程在执行,但是只允许3个并发的执行。
执行流程:
1:我有抢票的资格了 1:我要开抢了 2:我有抢票的资格了 2:我要开抢了 3:我有抢票的资格了 3:我要开抢了 4:好可惜啊 5:好可惜啊 6:好可惜啊 7:好可惜啊 8:好可惜啊 9:好可惜啊 10:好可惜啊 2:终于抢到票了 4:我要开抢了 3:终于抢到票了 5:我要开抢了 5:终于抢到票了 6:我要开抢了 1:终于抢到票了 7:我要开抢了 4:终于抢到票了 8:我要开抢了 8:终于抢到票了 9:我要开抢了 7:终于抢到票了 10:我要开抢了 10:终于抢到票了 9:终于抢到票了 6:终于抢到票了
java并发编程之Semaphore相关推荐
- Java并发编程之Semaphore信号量
Semaphore: Semaphore基于AQS的共享模式实现,主要用于在总体许可(permits)一定的情况下,限制线程的并发访问,可用于实现:服务限流. 获取permits的过程: 如上图所示, ...
- zbb20180929 thread java并发编程之Condition
java并发编程之Condition 引言 在java中,对于任意一个java对象,它都拥有一组定义在java.lang.Object上监视器方法,包括wait(),wait(long timeout ...
- java并发编程之4——Java锁分解锁分段技术
转载自 java并发编程之4--Java锁分解锁分段技术 并发编程的所有问题,最后都转换成了,"有状态bean"的状态的同步与互斥修改问题.而最后提出的解决"有状态bea ...
- Java 并发编程之美:并发编程高级篇之一-chat
借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...
- Java 并发编程之美:并发编程高级篇之一
借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...
- Java并发编程之CAS第三篇-CAS的缺点
Java并发编程之CAS第三篇-CAS的缺点 通过前两篇的文章介绍,我们知道了CAS是什么以及查看源码了解CAS原理.那么在多线程并发环境中,的缺点是什么呢?这篇文章我们就来讨论讨论 本篇是<凯 ...
- Java并发编程之CyclicBarrier详解
简介 栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生.栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行.闭锁用于等待事件,而栅栏用于等待其他线程. CyclicBarrier ...
- Java并发编程之CountDownLatch、CyclicBarrier和Semaphore
前言 本文为对CountDownLatch.CyclicBarrier.Semaphore的整理使用 CountDownLatch CountDownLatch类位于java.util.concurr ...
- python并发编程之semaphore(信号量)_python 之 并发编程(守护进程、互斥锁、IPC通信机制)...
9.5 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就立即终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic process ...
最新文章
- STM32开发 -- 4G模块开发详解(1)
- 深度学习如何验证自己的想法
- 什么技能产品经理不会提,但技术人必须懂?
- ADO.NET2.0的十大新特性
- Redis中的客户端Sharding
- mysql数据库优化教程_mysql数据库索引优化学习教程
- 【HDU - 5187】zhx's contest (快速幂+ 快速乘,模板)
- [ZJOI2010]贪吃的老鼠
- bzoj 1096: [ZJOI2007]仓库建设(斜率DP)
- 犀牛书学习笔记(3):函数
- 读《About Face 4 交互设计精髓》16
- QT 简单应用之播放WAV声音
- ansi、unico、utf8
- 运维审计平台之堡垒机和跳板机
- python 获取 淘宝 app 数据_python-爬取app上数据
- 怎样开发自己的Telegram Bot
- 设计模式之禅之单一职责原则
- 畅捷通T+ v17任意文件上传漏洞复现
- F#中有趣的计量单位
- 小米9卡刷Android 11开发版并安装系统证书抓包
热门文章
- 2022年美国大学生数学建模竞赛常见问题汇总
- Kubernetes中部署Docker registry2.7.1并通过containerd实现拉取镜像到应用Pod的部署
- [How TO]-virtualbox下安装ubuntu14.04超详细
- Angular2 RC6 Route学习
- python with contextmanager yield 语法糖
- 【安全实战】红队攻防技术
- SQLite 数据库注入总结
- 【Shell】设置变量默认值,参数默认值, 自动赋值
- 4.1 基础-放苹果(整数划分)
- 牛客小白月赛37【部分题解】