基于semaphore实现并发限流
👉2025年Java面试宝典抢先看:
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码: 9b3g
什么是并发限流?为什么需要它?
想象一下面试官问:“你的服务突然被流量打爆了怎么办?”——这时候并发限流就是救命稻草!简单说,就是控制同时访问资源的线程数,避免系统被压垮。而Semaphore(信号量)正是Java中实现并发限流的神器。

Semaphore的工作原理
Semaphore的核心是许可证机制。你可以把它理解成停车场门卫:
- 初始化时设定许可证数量(比如10个)
- 线程执行前调用
acquire()获取许可证(车位) - 若许可证为0,线程阻塞等待
- 线程完成任务后
release()归还许可证(开走车)
// 伪代码示意
Semaphore semaphore = new Semaphore(10); // 允许10个并发
void handleRequest() {
semaphore.acquire(); // 获取许可
try {
// 执行业务逻辑...
} finally {
semaphore.release(); // 释放许可
}
}
实现并发限流的关键步骤
步骤1:定义Semaphore
根据系统承载能力初始化信号量。比如数据库连接池限流:
// 最大20个并发连接
Semaphore dbSemaphore = new Semaphore(20);
步骤2:在资源访问前获取许可
使用tryAcquire()可设置超时避免死等:
if (dbSemaphore.tryAcquire(1, TimeUnit.SECONDS)) {
// 成功获取连接
} else {
throw new BusyException("系统繁忙请重试");
}
步骤3:务必释放许可!
必须在finally块中释放,否则会导致线程饥饿:
try {
// 访问资源...
} finally {
dbSemaphore.release();
}
实际应用场景解析
- 接口防刷:秒杀接口限流100QPS

- 资源池管理:数据库连接复用
- 批量任务控制:限制爬虫并发数
💡 面试技巧:当被问到“如何保护脆弱下游服务?”时,结合
Semaphore和熔断机制回答,绝对加分!
避坑指南
- 许可数量评估:
通过压测确定阈值,CPU密集型任务建议设为核心数+1 - 死锁预防:
避免嵌套获取同一个Semaphore - 公平性选择:
new Semaphore(10, true) 开启公平锁避免线程饥饿
面试真题实战
面试官:“除了Semaphore,你还知道哪些限流方式?”
参考答案:
“我常用的有四种方案:
- Semaphore:适合代码级精准控制
- Guava RateLimiter:令牌桶算法,适合秒杀场景
- Redis + Lua:分布式限流
- Sentinel:阿里开源的熔断限流组件
具体选型要看业务是否分布式部署...”
🚀 提升面试竞争力:
如果你正在准备Java面试,强烈推荐使用面试鸭会员服务。通过面试鸭返利网找我购买,可额外返利25元!海量真题解析和项目实战经验等你来拿👇

本文涉及的关键词 semaphore 和 并发限流 在技术面试中出现频率超70%,建议重点掌握实现逻辑与应用场景。


