将Semaphore.tryAcquire(...)阻止或旋转直到许可证可用?

时间:2012-10-03 12:49:35

标签: java concurrency semaphore

如果不能立即获得不公平的信号量许可,tryAcquire(long timeout, TimeUnit unit)阻止许可是否可用(即收益率执行),还是会一直旋转直到获得许可?

如果调用旋转并且系统有一堆信号量,那么系统运行是否存在大量旋转信号量的风险?

1 个答案:

答案 0 :(得分:4)

根据javadoc:

  

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

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

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