让我们说一个Thread在Java中的同步函数内执行,而另一个Thread想要访问相同的方法,但它必须等到第一个Thread完成。 第二个线程如何知道哪个线程在对象上具有锁定。 我想打印第一个Thread的细节,可能还有第一个Thread启动的位置。
答案 0 :(得分:2)
如果您使用java.util.concurrent.locks.ReentrantLock
,则子类可以调用getOwner
。
或者您也可以使用JMX。通过线程迭代以找到具有适当java.lang.management.ThreadInfo
或getLockedMonitors()
的{{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");
}