请解释 Java 中 Semaphore 的作用及其典型使用场景。
考察说明
考查对 Java 并发同步工具 Semaphore 的理解与应用能力。
回答思路
- 【回答框架 1】Semaphore 是 Java 并发包中的计数信号量,用于控制同时访问特定资源的线程数量。核心机制通过计数器管理许可,线程获取许可后才能继续执行,否则阻塞等待。
- 【回答框架 2】Semaphore 支持公平与非公平模式。公平模式按线程等待顺序分配许可,非公平模式则可能抢占,默认非公平。构造时可指定许可数及是否公平。
- 【回答框架 3】典型场景包括限流、连接池或资源池管理。例如数据库连接池限制并发连接数,或接口限流控制同时处理的请求量。
- 【回答框架 4】使用 acquire 获取许可,release 释放许可。需确保在 finally 中释放,避免异常导致许可泄漏。
- 【回答框架 5】Semaphore 与锁不同,锁只允许一个线程进入临界区,Semaphore 允许多个许可,因此更适用于资源配额控制。但需注意许可数是总体上限,不保证具体资源分配公平性。
- 【关键点 1】Semaphore 控制并发访问的许可数量
- 【关键点 2】支持公平与非公平两种模式
- 【关键点 3】常用场景为限流和资源池管理
- 【关键点 4】必须正确释放许可以避免泄漏
- 【关键点 5】与互斥锁区分,可允许多个线程同时访问
- 【易错点 1】将 Semaphore 误用于保证互斥,实际它允许多许可并发
- 【易错点 2】忘记在 finally 中释放许可,导致资源耗尽
- 【易错点 3】认为 Semaphore 能保证业务幂等,它只控制并发,幂等需额外机制