如何发现死锁问题

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何发现死锁问题相关的知识,希望对你有一定的参考价值。

一、死锁示例演示

1、以最经典的哲学家吃饭的问题为场景,演示一下死锁的发生情况:

  • 示例代码

    package com.xz.springboottest.day1;
    
    /**
     * @description:
     * @author: xz
     */
    public class DeadLock {
        private static final String ACTION_ONE="拿起碗";
        private static final String ACTION_TWO="拿起筷子";
    
        public static void main(String[] args) {
            //哲学家小明
            new Thread(()->{
                synchronized (ACTION_ONE){
                    try {
                        Thread.sleep(1000);
                        synchronized (ACTION_TWO){
                            System.out.println("小明开始吃饭了。。。。。。");
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
    
            // 哲学家小张
            new Thread(()->{
                synchronized (ACTION_TWO){
                    try {
                        Thread.sleep(1000);
                        synchronized (ACTION_ONE){
                            System.out.println("小张开始吃饭了。。。。。。");
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
    
        }
    }
    
    
  • 在上面的例子中,哲学家必须要同时拿起碗和筷子能够吃饭,吃完才会释放碗和筷子的锁。而小明和小张去的这家餐厅,只剩下一只碗和一双筷子了。那么在他俩吃饭的场景下,就出现了死锁的问题。

二、如何排查死锁问题

  • 启动示例程序
  • 通过jps来看一下java进程
  • 发现pid=19892就是我们的进程,那么采用jstack命令输出线程的堆栈信息。

  • 从上面的日志输出,我们其实已经找到了死锁的痕迹,并且定位到了DeadLock的第33行和第19行。即:
  • 那么,我们发现了死锁代码,进行解决修复即可。

以上是关于如何发现死锁问题的主要内容,如果未能解决你的问题,请参考以下文章

Java并发编程实战 04死锁了怎么办?

Java并发编程实战 04死锁了怎么办?

如何正确地将多个片段添加到片段过渡?

如何通过编程发现Java死锁

一个SQL Server 2008 R2 死锁的问题解决

如何通过代码设置片段标签?