多线程应用程序冻结。也许这是由于僵局造成的。如果是,那么我们如何找到造成僵局的原因?任何有系统地完成此工作的工具和策略?寻找多线程死锁的原因?
回答
如果可能的话,使用无锁的数据结构像ConcurrentLinkedQueue。根据定义,无锁数据结构不会导致死锁。
总是以相同的顺序获取锁。如果您的资源是A,B和C,则所有线程都应按照A→B→C或A→C或B→C等顺序获取它们。如果一个线程获取了死锁它们按顺序A→B→C,而另一个线程以C→B→A的顺序获取它们。
使用锁定超时 - 如果计时器到期,则线程释放其锁定。确保在发生这种情况时进行记录,以便重新检查您的锁定顺序。
所有好主意,但他们都没有回答这个问题:如何找到现有程序中的错误。正如Boris the Spider,Vishal K.和Don所说,如果在JVM仍然挂起的情况下可以捕获它,则可以使用各种工具找出哪些线程正在等待哪些锁。这些信息通常会引导您找到根本原因。 (通常是你的#2,以上)。 – 2014-10-01 12:54:22
我要做的第一件事就是用JDK附带的jstack抓取线程堆栈。
用法:jstack <pid>
在这里你可以看到所有线程的当前运行状态。你可以看到线程waitung对锁等
文件:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html
在这里你可以看到不同的线程状态存在:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.State.html
我们如何找到死锁的原因?
- 使用程序
java.lang.management.ThreadMXBean
是找出死锁状态的线程Java中的答案。 下面是短代码演示:
import java.lang.management.*;
class DeadLockDetect
{
public void findDeadLocks()
{
ThreadMXBean tmx = ManagementFactory.getThreadMXBean();
long[] ids = tmx.findDeadlockedThreads();
if (ids != null)
{
ThreadInfo[] infos = tmx.getThreadInfo(ids,true,true);
System.out.println("Following Threads are deadlocked");
for (ThreadInfo info : infos)
{
System.out.println(info);
}
}
}
}
- 使用工具
JConsole的是讲述在你的代码运行的线程的几乎所有信息的工具之一。
- 1. Java线程的原因死锁
- 2. 多线程死锁
- 3. 确定死锁的原因
- 4. 死锁的根本原因?
- 5. 多线程中的死锁
- 6. 如何在UNIX上实际查找进程的死锁原因?
- 7. 多线程和死锁
- 8. 什么是死锁的常见原因?
- 9. 实例崩溃的原因死锁
- 10. 两个线程死锁,但看不出原因,锁使用JConsole发布notifyAll()
- 11. 有没有一种简单的方法来进行线程转储以查找线程死锁的原因?
- 12. 寻找死锁场景的指导
- 13. Ruby线程死锁
- 14. C#线程死锁
- 15. C++线程死锁
- 16. Python线程死锁
- 17. Delphi线程死锁
- 18. Java,线程死锁?
- 19. Java线程死锁
- 20. 从oracle跟踪文件中找到死锁错误的原因
- 21. Java中的多线程死锁
- 22. Java中的多线程死锁
- 23. 查找mysql innodb死锁原因INSERT INTO SELECT
- 24. 在Java应用程序中查找死锁的原因的工具
- 25. 死锁的线程java
- 26. SQL Server插入多个线程死锁
- 27. FFMPEG:多线程解码死锁?
- 28. 一个进程成为死锁受害者的原因
- 29. 寻找NaN的错误的原因
- 30. 在C自制线程池的多线程死锁#
看一看:http://stackoverflow.com/questions/1102359/programmatic-deadlock-detection-in-java 有处理这个线程。 – 2013-04-10 21:31:02
进行线程转储,并查看是否存在某处的死锁。 – 2013-04-10 21:32:51
@andre - 如何制作资源使用情况图表? – 2013-04-10 21:33:50