【发布时间】:2011-02-23 11:12:32
【问题描述】:
我在一个单例类中有一个同步方法,它被许多线程同时调用。是否有任何 java API 可用于检查当前拥有锁的线程?
【问题讨论】:
标签: java multithreading
我在一个单例类中有一个同步方法,它被许多线程同时调用。是否有任何 java API 可用于检查当前拥有锁的线程?
【问题讨论】:
标签: java multithreading
erickson[here]给出的准确答案
问题:以编程方式确定哪个 Java 线程持有锁?
答案:
你只能判断当前是否 线程持有普通锁 (Thread.holdsLock(Object))。你不能 获取对具有的线程的引用 没有本机代码的锁。
但是,如果您正在做任何事情 线程复杂,你 可能想熟悉一下自己 与 java.util.concurrent 包。 ReentrantLock 确实允许 你得到它的主人(但它的 受保护的方法,所以你必须 扩展这个)。取决于你的 应用程序,很可能是通过 使用并发包,您将 发现你不需要得到 毕竟是锁的主人。
有一些非编程方法可以 找到锁的所有者,例如 向 JVM 发出发出线程的信号 转储到标准错误,这对 确定死锁的原因。
顺便说一下,请看下面的链接。它提供了有关线程相关方面的所有信息:
【讨论】:
您也许可以在您的同步方法中打印出Thread.currentThread()。
【讨论】:
jvm ThreadMXBean 让您可以访问各种线程相关信息,包括哪些线程拥有哪些锁。
【讨论】:
如果您只是在调试软件以找出导致阻塞的线程以及被阻塞的线程,我建议您简单地获取实时情况的线程转储。我不会将这种逻辑用作正常程序流程的一部分。
http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/
【讨论】: