package com.lomonkey.synchronize;
/**
* @author Lvdoudou
* @date 2023/6/1 0001 0:47
* @description 编写一个死锁
*/
public class DeadLockDemo {
static final Object o1 = new Object();
static final Object o2 = new Object();
public static void m1() {
synchronized (o1) {
System.out.println(Thread.currentThread().getName() + "获取到o1锁");
synchronized (o2) {
System.out.println(Thread.currentThread().getName() + "获取到o2锁");
}
}
}
public static void m2() {
synchronized (o2) {
System.out.println(Thread.currentThread().getName() + "获取到o2锁");
synchronized (o1) {
System.out.println(Thread.currentThread().getName() + "获取到o1锁");
}
}
}
public static void main(String[] args) {
new Thread(() -> {
m1();
}, "A").start();
new Thread(() -> {
m2();
}, "B").start();
}
}
第一种方法使用 jps
和jstack
分析`
Lvdoudou@Lomonkey MINGW64 /e/P-project/2023/study/JavaUtilConcurrent/untitled/src/main/java/com/lomonkey/synchronize (master)
$ jps
11204 RemoteMavenServer36
17012
6340 Jps
29336 DeadLockDemo
29912 Launcher
Lvdoudou@Lomonkey MINGW64 /e/P-project/2023/study/JavaUtilConcurrent/untitled/src/main/java/com/lomonkey/synchronize (master)
$ jstack 29336
Java stack information for the threads listed above:
===================================================
"B":
at com.lomonkey.synchronize.DeadLockDemo.m2(DeadLockDemo.java:27)
- waiting to lock <0x000000076c30cf38> (a java.lang.Object) # 这里等待 cf38这个对象
- locked <0x000000076c30cf48> (a java.lang.Object) # 这里锁住了cf48
at com.lomonkey.synchronize.DeadLockDemo.lambda$main$1(DeadLockDemo.java:38)
at com.lomonkey.synchronize.DeadLockDemo$$Lambda$2/939047783.run(Unknown Source)
at java.lang.Thread.run(Thread.java:750)
"A":
at com.lomonkey.synchronize.DeadLockDemo.m1(DeadLockDemo.java:17)
- waiting to lock <0x000000076c30cf48> (a java.lang.Object)# 这里等待cf48
- locked <0x000000076c30cf38> (a java.lang.Object)#这里锁住了 cf38
at com.lomonkey.synchronize.DeadLockDemo.lambda$main$0(DeadLockDemo.java:35)
at com.lomonkey.synchronize.DeadLockDemo$$Lambda$1/396180261.run(Unknown Source)
at java.lang.Thread.run(Thread.java:750)
Found 1 deadlock.
第二种使用jconsole
窗口查看
选择我们要查看的进程
点击不安全的链接