↑↑↑ 欢迎 点赞、关注、收藏!!!,10 年 IT 行业老鸟,持续分享更多 IT 干货
目录
如何使用 jstack 分析死锁
参考:https://www.yuque.com/hollis666/go2k1v/ql40gqum24bg3bdk
准备
一段死锁程序
package javaCommand; public class JStackDemo { public static void main(String[] args) { Thread t1 = new Thread(new DeadLockclass(true));//建立一个线程 Thread t2 = new Thread(new DeadLockclass(false));//建立另一个线程 t1.start();//启动一个线程 t2.start();//启动另一个线程 } } class DeadLockclass implements Runnable { public boolean falg;// 控制线程 DeadLockclass(boolean falg) { this.falg = falg; } public void run() { /** * 如果falg的值为true则调用t1线程 */ if (falg) { while (true) { synchronized (Suo.o1) { System.out.println("o1 " + Thread.currentThread().getName()); synchronized (Suo.o2) { System.out.println("o2 " + Thread.currentThread().getName()); } } } } /** * 如果falg的值为false则调用t2线程 */ else { while (true) { synchronized (Suo.o2) { System.out.println("o2 " + Thread.currentThread().getName()); synchronized (Suo.o1) { System.out.println("o1 " + Thread.currentThread().getName()); } } } } } } class Suo { static Object o1 = new Object(); static Object o2 = new Object(); }
执行一下,两个线程都阻塞等待了。
使用 jstack
接下来,我们使用jstack来看一下线程堆栈信息:
分析
Thread-1 在想要执行第40行的时候,当前锁住了资源<0x00000007d6aa2ca8>,但 是他在等待资源<0x00000007d6aa2c98> Thread-0 在想要执行第27行的时候,当前锁住了资源<0x00000007d6aa2c98>,但是他在等待资源<0x00000007d6aa2ca8> 这两个线程都持有资源,并且都等待对方的资源,所以造成了死锁。 原因我们找到了,就可以具体问题,具体分析,解决这个死锁了。
↑↑↑ 欢迎 点赞、关注、收藏!!!,10 年 IT 行业老鸟,持续分享更多 IT 干货