Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何找到当前持有java.util.concurrent.Semaphore许可证的线程?_Java_Multithreading_Concurrency_Semaphore_Thread Dump - Fatal编程技术网

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

如何找到当前持有java.util.concurrent.Semaphore许可证的线程?,java,multithreading,concurrency,semaphore,thread-dump,Java,Multithreading,Concurrency,Semaphore,Thread Dump,我试图分析一个线程转储,它似乎表明有许多线程正在等待许可证,即线程正在等待信号量.acquire() 我之所以能够暗示这一点,是因为线程处于等待(驻车)状态,据我所知,信号量不使用锁监视器,而是使用等待另一个线程对其进行解析 现在,有没有一种方法可以从线程转储中暗示当前所有线程都持有信号量所允许的内容 类似于查找处于阻塞状态的线程,并检查哪个线程持有导致线程阻塞的锁?有一些工具可以帮助您分析转储。Yourkit就是这样一种工具,可用于分析阻塞的线程 参考: 信号量没有所有权概念,也不了解线程。这

我试图分析一个线程转储,它似乎表明有许多线程正在等待许可证,即线程正在等待信号量.acquire()

我之所以能够暗示这一点,是因为线程处于等待(驻车)状态,据我所知,信号量不使用锁监视器,而是使用等待另一个线程对其进行解析

现在,有没有一种方法可以从线程转储中暗示当前所有线程都持有信号量所允许的内容


类似于查找处于阻塞状态的线程,并检查哪个线程持有导致线程阻塞的锁?

有一些工具可以帮助您分析转储。Yourkit就是这样一种工具,可用于分析阻塞的线程

参考:

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

您还可以从以下事实中看到这一点:线程可以释放信号量,而不需要获取它


您必须查看stacktraces,以查看线程在等待什么信号量,并从那里向后工作。

当您获得许可证时,实际上没有任何保留;当你释放它时,没有什么可以回报的。没有线程实际持有任何东西——它只是一个计数器。e、 g.信号量可以从零许可开始,你可以合法地调用release。@安迪·特纳(Andy Turner)就是这样,那么我可以简单地得出结论:不可能通过线程转储找到哪些线程成功地获得了许可证吗?@aathif信号量不知道线程,这就是为什么它们特别轻量级的原因(在异步编程中非常有用)。一个线程可以释放一个信号量,而从来没有获得过它。没有所有权的概念。你必须以艰难的方式来做,并分析堆栈跟踪,以找到它们等待的位置,然后从那里开始。@Voo Right,这是一个精确的解释。也许你真的应该添加你的注释作为答案。我知道这样的线程转储分析rs.如果您能写下YourKit将如何帮助我找到哪些线程具有导致争用的信号量许可证,那就太好了。YourKit可用于分析线程和监视器。在YourKit中,您将发现一个threads选项卡允许您查看状态(等待、阻止等)在所有线程中。它还告诉您它是否是守护进程线程以及更多。要查看工具包中的监视器使用详细信息,请转到查看->监视器使用。但不确定是否可以获得信号量许可的详细信息。