博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Semaphore 简介
阅读量:5097 次
发布时间:2019-06-13

本文共 1245 字,大约阅读时间需要 4 分钟。

是什么

Semaphore是向外分发资源的许可证,可以允许一个或多个任务同时访问资源。

Semaphore通过构造参数来指定许可证的数量;acquire方法阻塞式获取许可证;release方法释放许可证。

可以将其比喻为地铁的安检,每当人流量高峰的时候,安检会先让几个人进去,然后拦住后面的人,待前面几人通过安检门后,会对后面的人用相同的方式放行。

应用场景

  1. 限流:比如大批量请求有并发限制的接口。
public class SemaphoreDemo {    private static final int THREAD_COUNT = 30; private static ExecutorService service = Executors.newFixedThreadPool(THREAD_COUNT); private static Semaphore semaphore = new Semaphore(2); public static void main(String[] args) { for(int i = 0;i < THREAD_COUNT;i++){ service.execute(new Runnable() { public void run() { try { semaphore.acquire(); dowork(); TimeUnit.SECONDS.sleep(3); semaphore.release(); } catch (InterruptedException e) { e.printStackTrace(); } } }); } service.shutdown(); } }
  1. 轮询:在生产者-消费者模式中,消费者可以通过信号量方式判断queue是否为空。

消费者

@Override	public void run() { this.isStop = false; while (!isStop) { try { Semaphore semaphore = doWork(); if (semaphore != null) { int acquireCount = semaphore.availablePermits(); acquireCount = acquireCount == 0 ? 1 : acquireCount; semaphore.tryAcquire(acquireCount, 1, TimeUnit.SECONDS); } } catch (Throwable e) { } } }

生产者只需要在添加队列时调用release方法。 消费端的代码相当于判断queue是否为空,为空等待1s后执行dowork,不为空直接执行dowork。

参考:

《Java 编程思想》

《Java 并发编程的艺术》

转载于:https://www.cnblogs.com/lbzkm/p/7450933.html

你可能感兴趣的文章
JavaScript 克隆数组
查看>>
eggs
查看>>
python3 生成器与迭代器
查看>>
CPU,寄存器,一缓二缓.... RAM ROM 外部存储器等简介
查看>>
git .gitignore 文件不起作用
查看>>
digitalocean --- How To Install Apache Tomcat 8 on Ubuntu 16.04
查看>>
【题解】[P4178 Tree]
查看>>
cer证书签名验证
查看>>
【深度学习】caffe 中的一些参数介绍
查看>>
QML学习笔记之一
查看>>
App右上角数字
查看>>
小算法
查看>>
新作《ASP.NET MVC 5框架揭秘》正式出版
查看>>
WPF中实现多选ComboBox控件
查看>>
读构建之法第四章第十七章有感
查看>>
Windows Phone开发(4):框架和页 转:http://blog.csdn.net/tcjiaan/article/details/7263146
查看>>
python asyncio 异步实现mongodb数据转xls文件
查看>>
TestNG入门
查看>>
【ul开发攻略】HTML5/CSS3菜单代码 阴影+发光+圆角
查看>>
IOS-图片操作集合
查看>>