多线程应用程序冻结。也许是因为僵局造成的。如果是,那么我们如何找到死锁的原因?系统地执行此操作的任何工具和策略?
答案 0 :(得分:7)
如果可能,请使用像ConcurrentLinkedQueue这样的无锁数据结构。根据定义,无锁数据结构不会导致死锁。
始终以相同的顺序获取锁定。如果您的资源是A,B和C,那么所有线程都应按A - >的顺序获取它们。 B - > C或A - >; C或B - > C等。如果一个线程以A - >的顺序获取它们,则可能发生死锁。 B - > C,而另一个线程以C - >的顺序获取它们。 B - >甲
使用锁定超时 - 如果计时器到期,则线程释放其锁定。请务必在发生这种情况时进行记录,以便重新检查锁定顺序。
答案 1 :(得分:7)
我们如何找到死锁的原因?
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);
}
}
}
}
答案 2 :(得分:3)
我要做的第一件事是使用JDK附带的jstack获取线程堆栈。
用法:jstack <pid>
在这里,您可以看到所有正在运行的线程的当前状态。你可以看到线程等待锁等。
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