以编程方式确定哪个Java线程持有锁


问题内容

在运行时是否可以以编程方式检查持有给定对象锁的线程的名称?


问题答案:

您只能说出当前线程是否持有普通锁(Thread.holdsLock(Object))。没有本机代码,您将无法获得对具有锁的线程的引用。

但是,如果您要对线程进行任何复杂的处理,则可能需要熟悉java.util.concurrent包。该ReentrantLock确实让你得到它的所有者(但其受保护的方法,所以你必须要扩展这个)。根据您的应用程序的不同,很可能是通过使用并发包,您会发现根本不需要获取锁的所有者。

有一些非编程方法可以找到锁所有者,例如发信号通知JVM向stderr发出线程转储,这对确定死锁的原因很有用。