Java 查找多线程死锁的原因?

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

多线程应用程序冻结。也许是僵局造成的。如果是,那么我们如何找到僵局的原因?有什么工具和策略可以系统地实现这一点吗?

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

用法:
jstack

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

文件:

在这里,您可以看到存在哪些不同的线程状态:

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

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

  • 使用锁超时-如果计时器过期,则线程释放其锁。发生这种情况时,请务必记录日志,以便重新检查锁的顺序

  • 我们如何找到僵局的原因

    • 使用程序
    是查找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是一种工具,它告诉您代码中运行的线程的几乎所有信息

    看一看:有一个线程在处理这个问题。进行线程转储,看看某个地方是否存在死锁。@andre-如何绘制资源使用情况图?所有这些都是好主意,但没有一个能回答这个问题:如何在现有程序中查找错误。正如Spider Boris、Vishal K.和Don所说,如果您能够在JVM仍然挂起时捕获它,那么您可以使用各种工具来找出哪些线程正在等待哪些锁。这些信息通常会引导你找到根本原因。(通常是上面的#2)。我可以使用jps命令添加-to-get-PID