java死锁排查
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.
只要互相等待对方释放锁就有可能出现死锁。