什么是死锁
两个所对象,互相应用。都不能释放,阻塞在哪里
代码
package cn.lin.juc;
import java.sql.SQLOutput;
/**
* @author ChengLin
* @date 2025/2/23 10:24
*/
public class DeadlockDemo {
public static void main (String[] args) {
final Object oa = new Object();
final Object ob = new Object();
new Thread(() -> {
synchronized (oa) {
System.out.println("进入了 a 锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (ob) { //获取 b 对象(b对象被锁住了,这里获取不了)
System.out.println("获取到了 b 锁");
System.out.println("1");
}
}
}).start();
new Thread(() -> {
synchronized (ob) {
System.out.println("进入了 b 锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (oa) {//a对象被锁住了。获取不了
System.out.println("获取到了 b 锁");
System.out.println("1");
}
}
}).start();
}
}
命令
jps -l 定位死锁进程
jps -l
jps -l
528 com.intellij.idea.Main
17859 org.jetbrains.jps.cmdline.Launcher
17860 cn.lin.juc.DeadlockDemo
18070 jdk.jcmd/sun.tools.jps.Jps
553 com.intellij.idea.Main
jstack 查看进程里 死锁的具体异常情况
jstack 17860(进程号)
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x00007fc1188186a8 (object 0x000000066ac6ade0, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x00007fc118815e18 (object 0x000000066ac6adf0, a java.lang.Object),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at cn.lin.juc.DeadlockDemo.lambda$main$1(DeadlockDemo.java:42)
- waiting to lock <0x000000066ac6ade0> (a java.lang.Object)
- locked <0x000000066ac6adf0> (a java.lang.Object)
at cn.lin.juc.DeadlockDemo$$Lambda$2/793589513.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
"Thread-0":
at cn.lin.juc.DeadlockDemo.lambda$main$0(DeadlockDemo.java:26)
- waiting to lock <0x000000066ac6adf0> (a java.lang.Object)
- locked <0x000000066ac6ade0> (a java.lang.Object)
at cn.lin.juc.DeadlockDemo$$Lambda$1/284720968.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
Found 1 deadlock.
jconsole