我在单例类中有一个synchronized方法,它同时被许多线程调用。有没有可用的Java API来检查哪个线程当前拥有锁?
答案 0 :(得分:3)
erickson
[here]
问题:以编程方式确定哪个Java 线程持有锁?
答案:
你只能判断当前是否存在 线程持有正常锁定 (Thread.holdsLock(对象))。你不能 获得对具有的线程的引用 没有本机代码的锁。
然而,如果你正在做任何事情 很复杂的线程,你 可能想要熟悉自己 使用java.util.concurrent 包。 ReentrantLock确实允许 你得到它的主人(但它的一个 受保护的方法,所以你必须这样做 延伸这个)。取决于你的 应用程序,很可能是 使用并发包,你会 发现你不需要得到 毕竟是锁的主人。
有非编程方法 找到锁主人,比如 发信号通知JVM发出一个线程 转储到stderr,这对有用 确定死锁的原因。
请顺便提一下,请看以下链接。它提供了有关线程相关方面的所有信息:
答案 1 :(得分:2)
您可以在同步方法中打印Thread.currentThread()
。
答案 2 :(得分:2)
jvm ThreadMXBean使您可以访问各种与线程相关的信息,包括哪些线程拥有哪些锁。
答案 3 :(得分:0)
如果您只是想调试软件以确定导致阻塞的哪个线程以及哪个线程被阻止,我建议简单地获取实时情况的线程转储。我不会将这种逻辑用作正常程序流程的一部分。
http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/