在multithreading中找到死锁的原因?

multithreading应用程序冻结。 也许是因为僵局造成的。 如果是,那么我们如何找到死锁的原因? 系统地执行此操作的任何工具和策略?

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

  2. 始终以相同的顺序获取锁。 如果您的资源是A,B和C,那么所有线程都应按A – > B – > C,或A – > C或B – > C等顺序获取它们。如果一个线程获得,则会发生死锁它们按顺序A – > B – > C而另一个线程按顺序C – > B – > A获取它们。

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

  4. 使用死锁检测 。

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

  • 使用程序

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是几乎可以告诉您代码中运行的线程的所有信息的工具之一。

我要做的第一件事是使用JDK附带的jstack获取线程堆栈。

用法: jstack

在这里,您可以看到所有正在运行的线程的当前状态。 你可以看到线程等待锁等。

Doc: 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