废话不多说,直接贴上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)。这就可以排查到死锁的原因从而进一步解决问题。