Boa*_*ann 8 java synchronization
对于Java对象,有没有办法告诉哪个Thread(或null)当前拥有其监视器?或者至少一种方法来判断当前线程是否拥有它?
我自己找到了一些答案.要测试当前线程是否包含监视器,Thread.holdsLock存在!
if (!Thread.holdsLock(data)) {
throw new RuntimeException(); // complain
}
Run Code Online (Sandbox Code Playgroud)
这非常快(亚微秒),自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;
}
Run Code Online (Sandbox Code Playgroud)
这有几点需要注意:
ThreadMXBean.isObjectMonitorUsageSupported()是真的,因此它的可移植性较差.但是如果你只想测试当前的线程,那就Thread.holdsLock太棒了!否则,实现java.util.concurrent.locks.Lock可以提供比普通Java监视器更多的信息和灵活性(感谢@ user1252434).
| 归档时间: |
|
| 查看次数: |
2031 次 |
| 最近记录: |