【问题标题】:How to find which thread currently owns the lock in java如何在java中找到当前拥有锁的线程
【发布时间】:2011-02-23 11:12:32
【问题描述】:

我在一个单例类中有一个同步方法,它被许多线程同时调用。是否有任何 java API 可用于检查当前拥有锁的线程?

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    erickson[here]给出的准确答案

    问题:以编程方式确定哪个 Java 线程持有锁?


    答案:

    你只能判断当前是否 线程持有普通锁 (Thread.holdsLock(Object))。你不能 获取对具有的线程的引用 没有本机代码的锁。

    但是,如果您正在做任何事情 线程复杂,你 可能想熟悉一下自己 与 java.util.concurrent 包。 ReentrantLock 确实允许 你得到它的主人(但它的 受保护的方法,所以你必须 扩展这个)。取决于你的 应用程序,很可能是通过 使用并发包,您将 发现你不需要得到 毕竟是锁的主人。

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

    顺便说一下,请看下面的链接。它提供了有关线程相关方面的所有信息:

    【讨论】:

      【解决方案2】:

      您也许可以在您的同步方法中打印出Thread.currentThread()

      【讨论】:

      • 我认为我的问题不是很精确。尝试调用同步方法时,其中一个线程被阻塞。所以我计划运行一个定时器任务,它可以调用一些java API,它可以帮助我知道哪个线程拥有那个锁。这可能吗?
      • 我认为你做不到。但即使你要实现它,你会用线程做什么?除非它自行退出执行或超时,否则无论如何您都无法停止它。
      【解决方案3】:

      jvm ThreadMXBean 让您可以访问各种线程相关信息,包括哪些线程拥有哪些锁。

      【讨论】:

        【解决方案4】:

        如果您只是在调试软件以找出导致阻塞的线程以及被阻塞的线程,我建议您简单地获取实时情况的线程转储。我不会将这种逻辑用作正常程序流程的一部分。

        http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多