知识卡片

Semaphore限制共享名额

普通读书笔记卡 · 1526

内容

Semaphore(信号量)维护一组虚拟许可,数量在构造时指定,本质是许可证管理器:线程访问资源前调用 acquire() 获取许可,许可数为 0 就阻塞;用完调用 release() 归还。它和互斥锁的区别是名额可大于 1——书中以银行 10 人排队、2 个窗口为例,2 个许可意味着同一秒最多 2 个线程进入临界区。适合连接池、限流这类”最多 N 个使用者”的场景,而不只是互斥。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第5章《JUC显式锁的原理与实战》5.5.2节《共享锁Semaphore》(源文件:_epub-src/OEBPS/Text/chapter176.xhtml) - 结论依据:原文定义“Semaphore可以用来控制在同一时刻访问共享资源的线程数量……维护了一组虚拟许可……线程在访问共享资源前必须调用Semaphore的acquire()方法获得许可,如果许可数量为0,该线程就一直阻塞”,并用银行10人、2个窗口的Semaphore(2)示例演示每秒只有2个线程进入临界区,因此推出本卡结论。 - 原始内容:Semaphore可以用来控制在同一时刻访问共享资源的线程数量,通过协调各个线程以保证共享资源的合理使用。Semaphore维护了一组虚拟许可,它的数量可以通过构造器的参数指定……更形象的说法是:Semaphore是一个许可管理器……假设有10个人在银行办理业务,只有两个工作窗口,使用Semaphore模拟银行排队……通过结果可以看出,每一秒中只有两个线程进入临界区。