Java 查找多线程死锁的原因?
多线程应用程序冻结。也许是僵局造成的。如果是,那么我们如何找到僵局的原因?有什么工具和策略可以系统地实现这一点吗?我要做的第一件事是使用JDK附带的jstack获取线程堆栈 用法:Java 查找多线程死锁的原因?,java,multithreading,concurrency,deadlock,Java,Multithreading,Concurrency,Deadlock,多线程应用程序冻结。也许是僵局造成的。如果是,那么我们如何找到僵局的原因?有什么工具和策略可以系统地实现这一点吗?我要做的第一件事是使用JDK附带的jstack获取线程堆栈 用法:jstack 在这里,您可以看到所有正在运行的线程的当前状态。你可以看到线程等待锁等 文件: 在这里,您可以看到存在哪些不同的线程状态: 如果可能,请使用无锁数据结构,如。根据定义,无锁数据结构不会导致死锁 始终以相同的顺序获取锁。如果您的资源是A、B和C,那么所有线程都应该按照A->B->C或A->C或B->C等顺序
jstack
在这里,您可以看到所有正在运行的线程的当前状态。你可以看到线程等待锁等
文件:
在这里,您可以看到存在哪些不同的线程状态:
- 使用程序
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是一种工具,它告诉您代码中运行的线程的几乎所有信息