面试题答案
一键面试信号量的优势
- 计数特性:信号量可以维护一个计数器,允许多个线程或进程同时访问共享资源,而互斥锁只能允许一个线程访问。例如在数据库连接池场景中,信号量可用于控制连接的数量,允许多个线程获取连接,但总数不超过连接池大小。
- 资源分配灵活:适用于需要控制资源使用数量的场景。如限制同时运行的任务数,可通过初始化信号量为任务上限值,任务开始获取信号量,结束释放信号量来实现。
信号量的劣势
- 复杂性:相比互斥锁,信号量的使用和理解更为复杂。互斥锁简单直接,只有锁定和解锁操作,而信号量需要管理计数器,操作不当易引发逻辑错误。
- 性能开销:信号量的计数操作和额外逻辑会带来一定性能开销,在仅需简单保护共享资源的场景下,使用信号量可能不如互斥锁高效。
根据需求选择同步机制 - 以信号量为例
- 资源数量限制需求:如果应用场景中有明确的资源数量限制,如线程池中的线程数量、文件描述符数量等,信号量是很好的选择。例如在一个网络爬虫程序中,为防止对目标服务器造成过大压力,限制同时发起的HTTP请求数量,可使用信号量。初始化信号量为允许的最大请求数,每个请求发起前获取信号量,请求结束后释放信号量。
- 复杂同步逻辑:当同步逻辑不仅仅是简单的互斥访问,还涉及到资源数量的控制和管理时,信号量更合适。比如在一个分布式系统中,不同节点需要竞争有限的共享资源(如许可证),信号量可以实现这种复杂的资源分配和同步机制。而如果只是简单保护一段共享数据不被同时访问,互斥锁更为简单高效;如果涉及线程间的等待和唤醒,条件变量可能更合适。