死锁的简单原理和排查

发布于:2025-02-24 ⋅ 阅读:(15) ⋅ 点赞:(0)

什么是死锁
两个所对象,互相应用。都不能释放,阻塞在哪里

代码

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述