gpt4 book ai didi

java - 确定哪个线程拥有监视器

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:38:46 25 4
gpt4 key购买 nike

有没有办法告诉 Java 对象,哪个线程(或 null)当前拥有它的监视器?或者至少是一种判断当前线程是否拥有它的方法?

最佳答案

我自己找到了一些答案。要测试当前线程是否持有监视器,Thread.holdsLock存在!

if (!Thread.holdsLock(data)) {
throw new RuntimeException(); // complain
}

这真的很快(亚微秒)并且从 1.4 开始可用。

一般情况下,要测试哪个线程(或线程 ID)持有锁,可以使用 java.lang.management 执行此操作类(感谢@amicngh)。

public static long getMonitorOwner(Object obj) {
if (Thread.holdsLock(obj)) return Thread.currentThread().getId();
for (java.lang.management.ThreadInfo ti :
java.lang.management.ManagementFactory.getThreadMXBean()
.dumpAllThreads(true, false)) {
for (java.lang.management.MonitorInfo mi : ti.getLockedMonitors()) {
if (mi.getIdentityHashCode() == System.identityHashCode(obj)) {
return ti.getThreadId();
}
}
}
return 0;
}

这里有一些注意事项:

  1. 有点慢(在我的例子中大约 ½ 毫秒,并且可能随着线程数量线性增加)。
  2. 它需要 Java 1.6 和 ThreadMXBean.isObjectMonitorUsageSupported() 为 true 的 VM,因此它的可移植性较差。
  3. 它需要“监控”安全许可,因此可能无法在沙盒小程序中运行。
  4. 如果需要,将线程 ID 转换为 Thread 对象有点不简单,因为我想您必须使用 Thread.enumerate,然后循环查找具有 ID 的对象,但是这具有理论上的竞争条件,因为在您调用枚举时,该线程可能不再存在,或者可能出现了具有相同 ID 的新线程。

但是如果您只想测试当前线程,Thread.holdsLock 效果很好!否则,java.util.concurrent.locks.Lock 的实现可以提供比普通 Java 监视器更多的信息和灵 active (感谢 @user1252434)。

关于java - 确定哪个线程拥有监视器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17206932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com