java死锁排查示例

70 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

package com.seeyon.test;


public class DealThread implements  Runnable {

    public  String username;

    public Object lock1 = new Object();
    public Object lock2 = new Object();

    public   void setFlag(String username) {
        this.username = username;
    }


    @Override
    public void run() {
        if (username.equals("a")) {
            synchronized (lock1) {
                try {
                    System.out.println("username =" + username);
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                   e.printStackTrace();
                }
                synchronized ( lock2) {
                    System.out.println("lock1 -> lock2 代码顺序执行了!");
                }
            }
        }

        if (username.equals("b")) {
            synchronized (lock2) {
                try {
                    System.out.println("username =" + username);
                    Thread.sleep(3000);
                }catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock1) {
                    System.out.println("lock2 -> lock1");
                }
            }
        }
    }
}

package com.seeyon.test;

/**
 * @Author: xulihui
 * @CreateTime: 2022-1-8 15:48
 * @Description:
 */
public class Run {

    public static void main(String[] args) throws Exception {
        DealThread t1 = new DealThread();
        t1.setFlag("a");

        Thread thread1 = new Thread(t1);
        thread1.start();
        Thread.sleep(1000);
        t1.setFlag("b");
        Thread thread2 = new Thread(t1);
        thread2.start();
    }
}

C:\Users\>jps -l
18144 org.jetbrains.jps.cmdline.Launcher
20144
9156 org.jetbrains.idea.maven.server.RemoteMavenServer36
4744 sun.tools.jps.Jps
15548 com.intellij.rt.execution.CommandLineWrapper

C:\Users\>jstack -l 15548
2022-01-08 16:02:46
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode):

"DestroyJavaVM" #14 prio=5 os_prio=0 tid=0x0000000000b1e000 nid=0x4cbc waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Thread-1" #13 prio=5 os_prio=0 tid=0x000000001eb04800 nid=0x26c4 waiting for monitor entry [0x000000001f8af000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at com.seeyon.test.DealThread.run(DealThread.java:41)
        - waiting to lock <0x000000076c080f00> (a java.lang.Object)
        - locked <0x000000076c080f10> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
        - None

"Thread-0" #12 prio=5 os_prio=0 tid=0x000000001eae6800 nid=0x382c waiting for monitor entry [0x000000001f7af000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at com.seeyon.test.DealThread.run(DealThread.java:27)
        - waiting to lock <0x000000076c080f10> (a java.lang.Object)
        - locked <0x000000076c080f00> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
        - None

"Service Thread" #11 daemon prio=9 os_prio=0 tid=0x000000001e982800 nid=0x4db8 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C1 CompilerThread3" #10 daemon prio=9 os_prio=2 tid=0x000000001e8de800 nid=0x7c0 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C2 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x000000001e8d6800 nid=0x43e0 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x000000001e8cb800 nid=0x3c90 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x000000001e8d1800 nid=0x3bf0 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x000000001e8b4000 nid=0x2a04 runnable [0x000000001f06e000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.SocketInputStream.read(SocketInputStream.java:171)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
        - locked <0x000000076bc84240> (a java.io.InputStreamReader)
        at java.io.InputStreamReader.read(InputStreamReader.java:184)
        at java.io.BufferedReader.fill(BufferedReader.java:161)
        at java.io.BufferedReader.readLine(BufferedReader.java:324)
        - locked <0x000000076bc84240> (a java.io.InputStreamReader)
        at java.io.BufferedReader.readLine(BufferedReader.java:389)
        at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:61)

   Locked ownable synchronizers:
        - None

"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x000000001e89b000 nid=0x7c8 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x000000001e848000 nid=0x2edc runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x0000000002f7e000 nid=0x3338 in Object.wait() [0x000000001ed0f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000076bb08ec8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
        - locked <0x000000076bb08ec8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

   Locked ownable synchronizers:
        - None

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x0000000002f77000 nid=0x4a0c in Object.wait() [0x000000001e80f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000076bb06b68> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:502)
        at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
        - locked <0x000000076bb06b68> (a java.lang.ref.Reference$Lock)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

   Locked ownable synchronizers:
        - None

"VM Thread" os_prio=2 tid=0x000000001c929800 nid=0x2ae0 runnable

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x0000000002e97000 nid=0x1950 runnable

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x0000000002e98800 nid=0x42ec runnable

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x0000000002e9a000 nid=0x119c runnable

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x0000000002e9b800 nid=0x4548 runnable

"GC task thread#4 (ParallelGC)" os_prio=0 tid=0x0000000002e9f000 nid=0x328c runnable

"GC task thread#5 (ParallelGC)" os_prio=0 tid=0x0000000002ea0000 nid=0x41a4 runnable

"GC task thread#6 (ParallelGC)" os_prio=0 tid=0x0000000002ea3800 nid=0x43bc runnable

"GC task thread#7 (ParallelGC)" os_prio=0 tid=0x0000000002ea4800 nid=0x4290 runnable

"VM Periodic Task Thread" os_prio=2 tid=0x000000001e8fe800 nid=0x69c waiting on condition

JNI global references: 33


Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x0000000002f7d538 (object 0x000000076c080f00, a java.lang.Object),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x0000000002f7bf38 (object 0x000000076c080f10, a java.lang.Object),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
        at com.seeyon.test.DealThread.run(DealThread.java:41)
        - waiting to lock <0x000000076c080f00> (a java.lang.Object)
        - locked <0x000000076c080f10> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:748)
"Thread-0":
        at com.seeyon.test.DealThread.run(DealThread.java:27)
        - waiting to lock <0x000000076c080f10> (a java.lang.Object)
        - locked <0x000000076c080f00> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:748)

Found 1 deadlock.


只要互相等待对方释放锁就有可能出现死锁。