是否有可能在运行时以编程方式检查持有给定对象的锁的线程的名称?以编程方式确定哪个Java线程持有锁
回答
您只能分辨当前线程是否保持正常锁定(Thread.holdsLock(Object)
)。无法获得对没有本机代码的锁定的线程的引用。然而,如果你正在做任何与线程复杂的事情,你可能想要熟悉java.util.concurrent包。 ReentrantLock
确实可以让你获得它的所有者(但它是一种受保护的方法,所以你必须扩展它)。根据你的应用程序,很可能通过使用并发包,你会发现你根本不需要获得锁的所有者。
有非编程方法来查找锁拥有者,例如发信号通知JVM向stderr发出线程转储,这对确定死锁的原因很有用。
运行jconsole。它包含在Java SDK中,并从命令行运行。我不确定你使用的是什么操作系统,但是在windows上,你可以将它传递给java进程的PID。它应该可以帮助您找到导致问题的线程。或者,您可以使用像YourKit这样的商业分析器或任何数量的其他分析器。
从1.6开始,您可以使用JMX来执行各种有趣的事情,包括查找持有的锁。你不能得到实际的对象,但你得到的类和身份哈希值(这是不唯一的)。
在1.5,你可以找到所有的线程,并得到每个人的状态,例如像这样:
Map<Thread,StackTraceElement[]> map = Thread.getAllStackTraces();
for (Map.Entry<Thread, StackTraceElement[]> threadEntry : map.entrySet()) {
log.info("Thread:"+threadEntry.getKey().getName()+":"+threadEntry.getKey().getState());
for (StackTraceElement element : threadEntry.getValue()) {
log.info("--> "+element);
}
}
Thread.getState向您提供有关线程是否被阻塞,等待等,请参见jdk api ThreadState
您可以通过反射获得线程保持的锁定。这只适用于java 1.6。
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] ti = bean.getThreadInfo(bean.getAllThreadIds(), true, true);
有关每个ThreadInfo对象有哪些,你可以使用identityHashCode对他们比较有问题的锁LockInfo对象。
你可以使用一个变量来保存当前线程,当你锁定时,然后打印它,如果别人正在尝试使用它。
Thread holderOfLock = null;
Object theLock = new Object();
public void doStuff()
{
if(holderOfLock != null)
{
//get and print name of holderOfLock-thread or get stacktrace etc.
}
synchronized (theLock)
{
holderOfLock = Thread.currentThread();
//do stuff...
holderOfLock = null;
}
}
你可以通过调用wait()
或对象notify()
方法检查特定对象的锁。如果物体没有锁定,那么它会抛出llegalMonitorStateException
。
2-通过调用holdsLock(Object o)
方法。这将返回布尔值。
如果是重新-entrant锁ü如果它是由当前线程保持
final ReentrantLock lock = new ReentrantLock();
lock.isHeldByCurrentThread();
- 1. 以编程方式锁定Iphone以编程方式
- 2. 如何以编程方式查找所有线程持有的锁
- 3. 多线程以及多进程的Java文件锁定方式
- 4. 以编程方式锁定iphone(> iOS7)
- 5. 以编程方式锁定Android APK
- 6. 锁定屏幕以编程方式
- 7. 以编程方式自动锁定iPhone
- 8. 你将如何以编程方式确定显示哪个UITableViewRow?
- 9. sqlite - 以编程方式确定主键
- 10. 多个线程持有相同的锁?
- 11. 如何确定线程是否有锁?
- 12. 以编程方式确定安装哪些iFilters
- 13. 以编程方式确定系统是否支持待机
- 14. Android:以编程方式确定设备对TLS的支持
- 15. 以编程方式锁定和解锁ios中的屏幕
- 16. 如何在mac中以编程方式“锁定/解锁”屏幕
- 17. 在android中以编程方式锁定设备锁
- 18. Java线程锁
- 19. 以编程方式解除三个QDockWidgets的锁定
- 20. 以编程方式解锁MAC
- 21. Java线程分析:确定线程等待特定的锁和每个等待的持续时间
- 22. 一个线程可以同时持有两个锁吗?
- 23. 编程方式禁用大写锁定
- 24. 以编程方式确定适用于Java环境的AppEngine
- 25. 以编程方式确定Java会话超时
- 26. 正确处理跨线程共享类的锁定方式
- 27. 同步方法override-线程获取锁定哪个对象?
- 28. 你可以在wp7中以编程方式锁定屏幕
- 29. 以编程方式禁用纵向方向锁定
- 30. 以编程方式线程转储/ JDI(Java调试器接口)
请修改您的标题和发布,以表明你的意思是Java可以可以检查。标签不应该是与问题有关的唯一重要信息。 – 2008-09-08 20:24:52