2016-02-02 17 views
1

我想分析一个线程转储,它似乎表明有许多线程正在等待java.util.concurrent.Semaphore许可证,即线程正在Semaphore.acquire()上等待。如何查找当前拥有哪些线程java.util.concurrent.Semaphore允许?

这是我能够暗示的,因为线程处于WAITING(停放)状态,并且从我所了解的信号量中不使用LOCK监视器,而是使用LockSupport.park()代替,等待另一个线程将其停止。

现在,有没有办法从什么都线程当前持有的信号灯允许一个线程转储暗示?

在BLOCKED状态的线程找到类似,并检查哪个是保存这是造成线程阻塞锁的线程?

+4

当您获得许可证时,没有任何东西可以持有;当你释放它时没有什么可以回报的。没有任何线程实际上持有任何东西 - 它只是一个柜台。例如一个信号量可以从零许可开始,你可以合法地调用release。 –

+0

@Andy Turner准确地说,我可以简单地得出结论:不可能通过线程转储找到哪些线程已成功获取许可证? – aathif

+1

@aathif信号量不知道线程,这使得它们特别轻巧(并且在异步编程中非常有用)。一个线程可以释放一个信号量而无需获取它。没有所有权的概念。你必须以艰难的方式去做,并分析堆栈跟踪以找到他们正在等待的地方并从那里开始。 – Voo

回答

2

信号灯不具有所有权的概念或了解线程什么。这使得它们特别轻巧(并且在异步编程中非常有用,其中逻辑执行线程及其执行的硬件线程不一定具有1:1映射)。

你也可以从线程可以释放一个信号而没有获取它的事实中看到这一点。

你将不得不看的踪迹,看看哪些信号量的线程都在等待,并从那里向后工作。

1

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

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

+0

我知道这样的线程转储分析器。如果你能写关于YourKit如何帮助我找出哪些线程信号量允许导致争用,那将是非常好的。 – aathif

+0

Yourkit可用于分析线程以及监视器。 在Yourkit中你会发现一个线程标签可以让你查看所有线程的状态(等待,阻塞等)。它还会告诉你它是否是一个守护线程以及更多。 用于查看显示器使用情况详情 在Yourkit中查看 - >显示器使用情况。但不确定如果你能得到信号量许可的细节。 – Sneha

相关问题