Semaphore自白:限流器用我就对了!(1)

简介: Semaphore自白:限流器用我就对了!(1)

大家好,我是 Semaphore,我的中文名字叫“信号量”,我来自 JUC 家族(java.util.concurrent)


我们家族有很多优秀的成员,比如:CountDownLatch:等待其他线程都执行完再执行某线程CyclicBarrier:循环阻塞一组线程,直到某个事件达成,当然我也不比他们弱哦 罒ω罒。


以下是我的个人简历,希望各位读者老爷们给个好评和三连,先在此谢过了~


基本信息


  • 姓名:Semaphore


  • 中文名:(计数)信号量


  • 出生日期:JDK 1.5


  • 籍贯:JUC(java.util.concurrent)


  • 用途:Java 中的一个同步器,与 CountDownLatch 和 CyclicBarrier 不同,


  • Semaphore 是用来管理许可证的,线程在调用 acquire() 方法时,如果没有许可证,那么线程就会阻塞等待,直到有许可证时才能继续执行。许可证使用 release() 方法来发布(发布一个许可证),调用 acquire() 方法时,如果有证书会减少许可证并继续执行后面的代码,如果没有证书只能阻塞等待许可证,而 Semaphore 在创建时会声明许可证的最大数量。


专业技能

我的专业技能就是“管理证书”,使用此技能可以轻松的实现「限流」功能


什么是限流?


比如五一小长假快到了,到那时会有大量的人去各个景区游玩,但是每个景区能容纳的人是有限的,比如大西安的大唐芙蓉园,它的日承载量是 6 万人次,也就是说每天最多能让 6 万来这里游玩,但五一的时候会来很多的人,比如突然来了 10 万人,那这个时候就只能「限流」排队等待入园了。


微信图片_20220120180729.jpg


也就说,大唐芙蓉园会让 6 万人先进去玩,剩余的人在门口等待排队,当有人从里面出来的时候,才允许另一个排队的人进去。工作人员会把人数始终控制在 6 万人以下,这样做的目的是为了让游玩的人有一个好的体验,不至于造成一些意外事故,比如踩踏事件什么的,一定程度上保证了社会的稳定,也便于景区良好的口碑建立和日后的正常运营,而这种排队限制最大人数的行为就是「限流」


再来举个例子,比如以车辆的限号来说,它也是限流的一种常见场景。这样做的好处,一方面是可以保护环境尽可能少一些碳排放,另一方面能有效的缓解上、下班高峰时段的拥堵情况。尤其是在大西安,很难想象如果不限号,那么会堵成什么样?(PS:让原本本不富裕的生活更是雪上加霜...)


微信图片_20220120180816.jpg


咱们再从生活中的事例回到程序当中,假设一个程序只能为 10W 人提供服务,突然有一天因为某个热点事件,造成了系统短时间内的访问量迅速增加到了 50W,那么导致的直接结果是系统崩溃,任何人都不能用系统了,显然只有少人数能用远比所有人都不能用更符合我们的预期,因此这个时候我们要使用「限流」了。


使用Semaphore实现限流


Semaphore 在创建的时候可以设置证书的数量,相当于设置了限流的最大值,再通过 release() 方法来发放证书,通过 acquire() 方法来阻塞并等待证书,这样就通过控制证书的方式来实现限流功能了。

相关文章
|
5月前
|
Java 测试技术
Java多线程实战-从零手搓一个简易线程池(二)线程池实现与拒绝策略接口定义
Java多线程实战-从零手搓一个简易线程池(二)线程池实现与拒绝策略接口定义
|
5月前
|
安全 Java 开发工具
Semaphore:实现一个限流器
Semaphore:实现一个限流器
53 0
每日一博 - Semaphore使用场景分析以及源码分析
每日一博 - Semaphore使用场景分析以及源码分析
68 0
【AQS我可以讲十分钟】
【AQS我可以讲十分钟】
130 0
【AQS我可以讲十分钟】
深入理解JUC:第六章:Semaphore信号灯
深入理解JUC:第六章:Semaphore信号灯
深入理解JUC:第六章:Semaphore信号灯
|
存储 缓存 Java
JAVA多线程 | 实现用户任务排队 | 预估排队时长
JAVA多线程 | 实现用户任务排队 | 预估排队时长
369 0
JAVA多线程 | 实现用户任务排队 | 预估排队时长
|
存储 缓存 Java
线程池之刨根问底
线程池之刨根问底
116 0
线程池之刨根问底
我靠!Semaphore里面居然有这么一个大坑! (3)
我靠!Semaphore里面居然有这么一个大坑! (3)
261 0
我靠!Semaphore里面居然有这么一个大坑! (3)
抢红包算法(公平版和手速版)
抢红包有两种算法:二倍均值法(公平版)和线段切割法(手速版)
抢红包算法(公平版和手速版)
深夜!小胖问我什么是读写锁?插队策略?升降级?(上)
深夜!小胖问我什么是读写锁?插队策略?升降级?
深夜!小胖问我什么是读写锁?插队策略?升降级?(上)