Java 在许可证可用之前,Semaphore.tryAcquire(…)会阻止或旋转吗?

Java 在许可证可用之前,Semaphore.tryAcquire(…)会阻止或旋转吗?,java,concurrency,semaphore,Java,Concurrency,Semaphore,如果一个不公平的信号量许可证不能立即可用,tryAcquire(长超时,时间单位)会阻塞直到许可证可用(即产生执行),还是会旋转直到许可证可用 如果调用旋转,并且一个系统有一堆信号量,那么系统是否会有大量旋转信号量的风险?根据javadoc: 如果没有可用的许可证,则当前线程将出于线程调度目的被禁用,并处于休眠状态,直到发生以下三种情况之一: 另一个线程调用这个信号量的release()方法,当前线程下一个被分配一个许可证;或 其他线程中断当前线程;或 指定的等待时间已过 这表明线程被标记为

如果一个不公平的信号量许可证不能立即可用,
tryAcquire(长超时,时间单位)
会阻塞直到许可证可用(即产生执行),还是会旋转直到许可证可用

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

根据javadoc:

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

  • 另一个线程调用这个信号量的release()方法,当前线程下一个被分配一个许可证;或
  • 其他线程中断当前线程;或
  • 指定的等待时间已过
这表明线程被标记为阻塞(将阻塞队列置于灰色状态),这允许处理器执行其他工作。

根据javadoc:

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

  • 另一个线程调用这个信号量的release()方法,当前线程下一个被分配一个许可证;或
  • 其他线程中断当前线程;或
  • 指定的等待时间已过

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

Java文档是自解释的该死,我一定读错了TryQuire JavaDoc。。。但是正如它所解释的,它不会旋转而是产生执行。Java文档是自我解释的该死,我一定读错了TryQuire JavaDoc。。。但正如前面所解释的,它不会旋转,而是产生执行,“线程”不会被释放。它只是进入阻塞队列。你能重述最后一行吗?它不会旋转(
而(!canExecute);
)。这就足够让我们知道它将停留在不使用CPU的结构中,“线程”不会被释放。它只是进入阻塞队列。你能重述最后一行吗?它不会旋转(
而(!canExecute);
)。这足以让我们知道,它将停留在一些不使用CPU的结构中。