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相关推荐

  1. Java并发编程之Semaphore信号量

    Semaphore: Semaphore基于AQS的共享模式实现,主要用于在总体许可(permits)一定的情况下,限制线程的并发访问,可用于实现:服务限流. 获取permits的过程: 如上图所示, ...

  2. zbb20180929 thread java并发编程之Condition

    java并发编程之Condition 引言 在java中,对于任意一个java对象,它都拥有一组定义在java.lang.Object上监视器方法,包括wait(),wait(long timeout ...

  3. java并发编程之4——Java锁分解锁分段技术

    转载自 java并发编程之4--Java锁分解锁分段技术 并发编程的所有问题,最后都转换成了,"有状态bean"的状态的同步与互斥修改问题.而最后提出的解决"有状态bea ...

  4. Java 并发编程之美:并发编程高级篇之一-chat

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  5. Java 并发编程之美:并发编程高级篇之一

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  6. Java并发编程之CAS第三篇-CAS的缺点

    Java并发编程之CAS第三篇-CAS的缺点 通过前两篇的文章介绍,我们知道了CAS是什么以及查看源码了解CAS原理.那么在多线程并发环境中,的缺点是什么呢?这篇文章我们就来讨论讨论 本篇是<凯 ...

  7. Java并发编程之CyclicBarrier详解

    简介 栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生.栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行.闭锁用于等待事件,而栅栏用于等待其他线程. CyclicBarrier ...

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

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

  9. python并发编程之semaphore(信号量)_python 之 并发编程(守护进程、互斥锁、IPC通信机制)...

    9.5 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就立即终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic process ...

最新文章

  1. STM32开发 -- 4G模块开发详解(1)
  2. 深度学习如何验证自己的想法
  3. 什么技能产品经理不会提,但技术人必须懂?
  4. ADO.NET2.0的十大新特性
  5. Redis中的客户端Sharding
  6. mysql数据库优化教程_mysql数据库索引优化学习教程
  7. 【HDU - 5187】zhx's contest (快速幂+ 快速乘,模板)
  8. [ZJOI2010]贪吃的老鼠
  9. bzoj 1096: [ZJOI2007]仓库建设(斜率DP)
  10. 犀牛书学习笔记(3):函数
  11. 读《About Face 4 交互设计精髓》16
  12. QT 简单应用之播放WAV声音
  13. ansi、unico、utf8
  14. 运维审计平台之堡垒机和跳板机
  15. python 获取 淘宝 app 数据_python-爬取app上数据
  16. 怎样开发自己的Telegram Bot
  17. 设计模式之禅之单一职责原则
  18. 畅捷通T+ v17任意文件上传漏洞复现
  19. F#中有趣的计量单位
  20. 小米9卡刷Android 11开发版并安装系统证书抓包

热门文章

  1. 2022年美国大学生数学建模竞赛常见问题汇总
  2. Kubernetes中部署Docker registry2.7.1并通过containerd实现拉取镜像到应用Pod的部署
  3. [How TO]-virtualbox下安装ubuntu14.04超详细
  4. Angular2 RC6 Route学习
  5. python with contextmanager yield 语法糖
  6. 【安全实战】红队攻防技术
  7. SQLite 数据库注入总结
  8. 【Shell】设置变量默认值,参数默认值, 自动赋值
  9. 4.1 基础-放苹果(整数划分)
  10. 牛客小白月赛37【部分题解】