1

如果不公平的 Semaphore 许可证不能立即获得,在许可证可用之前会tryAcquire(long timeout, TimeUnit unit)阻塞(即产生执行),还是会旋转直到许可证可用?

如果调用旋转并且系统有一堆信号量,那么系统是否会冒着大量旋转信号量的风险?

4

1 回答 1

4

根据 javadoc:

如果没有可用的许可,则当前线程将被禁用以用于线程调度目的并处于休眠状态,直到发生以下三种情况之一:

  • 其他一些线程为此信号量调用 release() 方法,然后为当前线程分配一个许可;或者
  • 其他一些线程中断当前线程;或者
  • 指定的等待时间已过

这表明线程被标记为阻塞(作为灰色状态放入阻塞队列),这允许处理器执行其他工作。

于 2012-10-03T12:55:32.830 回答