我想分析一个线程转储,它似乎表明有许多线程正在等待java.util.concurrent.Semaphore许可证,即线程正在Semaphore.acquire()上等待。如何查找当前拥有哪些线程java.util.concurrent.Semaphore允许?
这是我能够暗示的,因为线程处于WAITING(停放)状态,并且从我所了解的信号量中不使用LOCK监视器,而是使用LockSupport.park()代替,等待另一个线程将其停止。
现在,有没有办法从什么都线程当前持有的信号灯允许一个线程转储暗示?
在BLOCKED状态的线程找到类似,并检查哪个是保存这是造成线程阻塞锁的线程?
当您获得许可证时,没有任何东西可以持有;当你释放它时没有什么可以回报的。没有任何线程实际上持有任何东西 - 它只是一个柜台。例如一个信号量可以从零许可开始,你可以合法地调用release。 –
@Andy Turner准确地说,我可以简单地得出结论:不可能通过线程转储找到哪些线程已成功获取许可证? – aathif
@aathif信号量不知道线程,这使得它们特别轻巧(并且在异步编程中非常有用)。一个线程可以释放一个信号量而无需获取它。没有所有权的概念。你必须以艰难的方式去做,并分析堆栈跟踪以找到他们正在等待的地方并从那里开始。 – Voo