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

时间:2016-02-02 16:46:41

标签: java multithreading concurrency semaphore thread-dump

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

我能够暗示因为线程处于等待(停放)状态,而且从我所理解的情况来看,Semaphore不使用LOCK监视器,而是使用LockSupport.park()代替,在另一个线程上等待取消它。

现在,有没有办法从线程转储中暗示所有线程当前持有Semaphore允许的内容?

类似于在BLOCKED状态下查找线程,并检查哪个是持有LOCK的线程导致线程阻塞?

2 个答案:

答案 0 :(得分:2)

信号量没有所有权的概念或对线程知之甚少。这使得它们特别轻量级(并且在异步编程中非常有用,其中您的逻辑执行线程和执行它的硬件线程不一定具有1:1映射)。

您还可以从线程可以释放信号量而无需获取它的事实中看到这一点。

你必须查看堆栈跟踪,看看线程在哪些信号量上等待并从那里向后工作。

答案 1 :(得分:1)

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

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