2013-04-10 88 views
4

多线程应用程序冻结。也许这是由于僵局造成的。如果是,那么我们如何找到造成僵局的原因?任何有系统地完成此工作的工具和策略?寻找多线程死锁的原因?

+0

看一看:http://stackoverflow.com/questions/1102359/programmatic-deadlock-detection-in-java 有处理这个线程。 – 2013-04-10 21:31:02

+0

进行线程转储,并查看是否存在某处的死锁。 – 2013-04-10 21:32:51

+0

@andre - 如何制作资源使用情况图表? – 2013-04-10 21:33:50

回答

6
  1. 如果可能的话,使用无锁的数据结构像ConcurrentLinkedQueue。根据定义,无锁数据结构不会导致死锁。

  2. 总是以相同的顺序获取锁。如果您的资源是A,B和C,则所有线程都应按照A→B→C或A→C或B→C等顺序获取它们。如果一个线程获取了死锁它们按顺序A→B→C,而另一个线程以C→B→A的顺序获取它们。

  3. 使用锁定超时 - 如果计时器到期,则线程释放其锁定。确保在发生这种情况时进行记录,以便重新检查您的锁定顺序。

  4. Use deadlock detection

+0

所有好主意,但他们都没有回答这个问题:如何找到现有程序中的错误。正如Boris the Spider,Vishal K.和Don所说,如果在JVM仍然挂起的情况下可以捕获它,则可以使用各种工具找出哪些线程正在等待哪些锁。这些信息通常会引导您找到根本原因。 (通常是你的#2,以上)。 – 2014-10-01 12:54:22

6

我们如何找到死锁的原因?

  • 使用程序

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的是讲述在你的代码运行的线程的几乎所有信息的工具之一。