如何发现死锁问题
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行。即:
- 那么,我们发现了死锁代码,进行解决修复即可。
以上是关于如何发现死锁问题的主要内容,如果未能解决你的问题,请参考以下文章