在multithreading中找到死锁的原因?
multithreading应用程序冻结。 也许是因为僵局造成的。 如果是,那么我们如何找到死锁的原因? 系统地执行此操作的任何工具和策略?
-
如果可能,请使用无锁数据结构,如ConcurrentLinkedQueue 。 根据定义,无锁数据结构不会导致死锁。
-
始终以相同的顺序获取锁。 如果您的资源是A,B和C,那么所有线程都应按A – > B – > C,或A – > C或B – > C等顺序获取它们。如果一个线程获得,则会发生死锁它们按顺序A – > B – > C而另一个线程按顺序C – > B – > A获取它们。
-
使用锁定超时 – 如果计时器到期,则线程释放其锁定。 请务必在发生这种情况时进行记录,以便重新检查锁定顺序。
-
使用死锁检测 。
我们如何找到死锁的原因?
- 使用程序
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