您当前的位置: 首页 > 

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

如何发现死锁问题

小志的博客 发布时间:2021-10-20 19:46:40 ,浏览量:0

目录
    • 一、死锁示例演示
    • 二、如何排查死锁问题

一、死锁示例演示

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行。即: 在这里插入图片描述
  • 那么,我们发现了死锁代码,进行解决修复即可。
关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0395s