使用jstack查看线程堆栈信息
jstack:jdk提供的一个工具,可以查看java进程中线程堆栈信息。
位于:jdk1.8.0_121\bin包下
死锁代码
public class DeadLockDemo { private static String A = "A"; private static String B = "B"; public static void main(String[] args) { new DeadLockDemo().deadLock(); } private void deadLock() { Thread t1 = new Thread(() -> { synchronized (A) { try { Thread.currentThread().sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (B) { System.out.println("1"); } } }); Thread t2 = new Thread(() -> { synchronized (B) { synchronized (A) { System.out.println("2"); } } }); t1.start(); t2.start(); } }
解释产生原因:
t1拿到锁将资源A锁住,此时时间片到了,线程切换到t2,t2锁住了资源B,此时轮到t1继续执行t1想锁住资源B
由于synchronized是独占型锁,t1只能等t2释放B的资源,但是t2又需要锁住资源A才能执行完代码并释放锁
此时t1等待t2释放资源,t2等待t1释放资源,此时就形成了死锁
具体的死锁相关概念请看我的另一边博客,这里就不详细介绍了
如何查询死锁信息
1.首先程序一直未结束,上段代码就可能出现了死锁现象
2.找到上面说的那个工具双击点击后是这个页面
3.找到我们运行的程序,并点击线程
4.此时出现了提示检测到死锁,然后我们点击线程 Dump
5.然后根据信息,我们可以清楚的看到程序发生死锁的原因