一个简单的死锁demo以及死锁分析

废话不多说,直接贴上demo代码:

import java.util.concurrent.TimeUnit;

public class DeadlockTest {
    public static void main(String[] args) {
        ResourceDeadlockTest resourceDeadlockTest = new ResourceDeadlockTest();

        String a = "suoA";
        String b = "suoB";

        new Thread(()->resourceDeadlockTest.deadLockTest(a, b)).start();
        new Thread(()->resourceDeadlockTest.deadLockTest(b, a)).start();
    }
}

class ResourceDeadlockTest{

    public void deadLockTest( String lockA, String lockB){
        synchronized (lockA) {
            System.out.println(Thread.currentThread().getName() + "\t持有锁:"+lockA);
            try {
                TimeUnit.SECONDS.sleep(2);
                synchronized (lockB){
                    System.out.println(Thread.currentThread().getName() + "\t持有锁:"+lockB);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

分析过程:

一、首先用jsp -l查询到当前死锁的java进程。

jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示***当前用户***所有java进程pid的命令。

在这里插入图片描述

二、然后用jstack xxxx得到指定pid的java stack堆栈信息

Found one Java-level deadlock:
=============================
"Thread-0":
  waiting to lock monitor 0x00000214db80c300 (object 0x00000000892b0940, a java.lang.String),
  which is held by "Thread-1"
"Thread-1":
  waiting to lock monitor 0x00000214db809c00 (object 0x00000000892b0910, a java.lang.String),
  which is held by "Thread-0"

Java stack information for the threads listed above:
===================================================
"Thread-0":
        at com.solid.demo.deadlockTest.ResourceDeadlockTest.deadLockTest(DeadlockTest.java:25)
        - waiting to lock <0x00000000892b0940> (a java.lang.String)
        - locked <0x00000000892b0910> (a java.lang.String)
        at com.solid.demo.deadlockTest.DeadlockTest.lambda$main$0(DeadlockTest.java:12)
        at com.solid.demo.deadlockTest.DeadlockTest$$Lambda$14/0x0000000100065c40.run(Unknown Source)
        at java.lang.Thread.run([email protected]/Thread.java:834)
"Thread-1":
        at com.solid.demo.deadlockTest.ResourceDeadlockTest.deadLockTest(DeadlockTest.java:25)
        - waiting to lock <0x00000000892b0910> (a java.lang.String)
        - locked <0x00000000892b0940> (a java.lang.String)
        at com.solid.demo.deadlockTest.DeadlockTest.lambda$main$1(DeadlockTest.java:13)
        at com.solid.demo.deadlockTest.DeadlockTest$$Lambda$15/0x0000000100098040.run(Unknown Source)
        at java.lang.Thread.run([email protected]/Thread.java:834)

Found 1 deadlock.

主要关注这些内容,发现了一个死锁,线程Thread-0持有锁<0x00000000892b0910> (a java.lang.String),等待锁<0x00000000892b0940> (a java.lang.String);线程Thread-1持有锁<0x00000000892b0940> (a java.lang.String),等待锁<0x00000000892b0910> (a java.lang.String)。这就可以排查到死锁的原因从而进一步解决问题。

原创文章 8 获赞 41 访问量 5628

猜你喜欢

转载自blog.csdn.net/jcSongle/article/details/106038152