如何找到当前持有 java.util.concurrent.Semaphore 许可的线程?

How to find which threads currently hold java.util.concurrent.Semaphore permits?

我正在尝试分析线程转储,它似乎表明有许多线程正在等待 java.util.concurrent.Semaphore 许可,即线程正在等待 Semaphore.acquire()。

这是我能够暗示的,因为线程处于 WAITING(停放)状态,据我了解,信号量不使用 LOCK 监视器,而是使用 LockSupport.park(),等待另一个线程取消停车。

现在,有没有办法从线程转储中暗示所有线程当前持有信号量许可?

类似于查找处于 BLOCKED 状态的线程,并检查哪个线程持有导致线程 BLOCK 的 LOCK?

有一些工具可以帮助您分析dumps.Yourkit就是这样一种可以用来分析阻塞线程的工具。

参考: https://www.yourkit.com/docs/java/help/monitor_profiling.jsp

信号量没有所有权的概念或对线程一无所知。这使它们特别轻巧(并且在异步编程中很有用,在这种情况下,您的逻辑 执行线程 和执行它的硬件线程不一定具有 1:1 映射)。

您还可以从以下事实中看出这一点:线程可以在从未获取信号量的情况下释放它。

您将必须查看堆栈跟踪以了解线程在什么信号量上等待的位置并从那里向后工作。