如何获取在对象上拥有Lock的Thread的详细信息

时间:2009-07-28 06:04:17

标签: java multithreading

让我们说一个Thread在Java中的同步函数内执行,而另一个Thread想要访问相同的方法,但它必须等到第一个Thread完成。 第二个线程如何知道哪个线程在对象上具有锁定。 我想打印第一个Thread的细节,可能还有第一个Thread启动的位置。

4 个答案:

答案 0 :(得分:2)

如果您使用java.util.concurrent.locks.ReentrantLock,则子类可以调用getOwner

或者您也可以使用JMX。通过线程迭代以找到具有适当java.lang.management.ThreadInfogetLockedMonitors()的{​​{1}}。

答案 1 :(得分:2)

这有点棘手,几乎是Tom Hawtin编写的内容,但是在dumpAllThreads中获取Thread Info时必须显式请求监视器信息。 类似的东西:

    Object lock = ...
    ThreadMXBean mx = ManagementFactory.getThreadMXBean();
    ThreadInfo[] allInfo = mx.dumpAllThreads(true, false);
    for (ThreadInfo threadInfo : allInfo) {
        MonitorInfo[] monitors = threadInfo.getLockedMonitors();
        for (MonitorInfo monitorInfo : monitors) {
            if (monitorInfo.getIdentityHashCode() == System.identityHashCode(lock)) {
                StackTraceElement[] stackTrace = threadInfo.getStackTrace();
                // use the the Information from threadInfo
            }
        }
    }

答案 2 :(得分:1)

这是用于诊断目的,还是用于您希望用作应用程序一部分的功能。如果是用于诊断,那么其他答案中的各种详细日志记录解决方案可能足以让您前进。如果你想在功能中做到这一点,那么你真的应该使用比synchronized关键字更强大和灵活的东西,比如@Tom提到的ReentrantLock魔法。

答案 3 :(得分:0)

我认为不可能这样做。但是你可以用一些额外的代码做类似的事情:

public void myFunction() {
  System.out.println("" + Thread.currentThread() + " entering sync @ myFunction");
  synchronized(this) {
    System.out.println("" + Thread.currentThread() + " entered sync @ myFunction");

    ...

    System.out.println("" + Thread.currentThread() + " leaving sync @ myFunction");
  }
  System.out.println("" + Thread.currentThread() + " left sync @ myFunction");
}
相关问题