1、死锁例子
代码例子
public class Main {
public static String obj1 = "obj1";
public static String obj2 = "obj2";
public static void main(String[] args) {
LockA la = new LockA();
Thread threadA = new Thread(la);
threadA.start();
LockB lb = new LockB();
Thread threadB = new Thread(lb);
threadB.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 此时两个线程都出BLOCKED状态
// BLOCKED
System.out.println(threadA.getState());
// BLOCKED
System.out.println(threadB.getState());
}
}
class LockA implements Runnable{
public void run() {
try {
System.out.println(System.currentTimeMillis() + " LockA 开始执行");
while(true){
synchronized (Main.obj1) {
System.out.println(System.currentTimeMillis() + " LockA 锁住 obj1");
Thread.sleep(3000); // 此处等待是给B能锁住机会
synchronized (Main.obj2) {
System.out.println(System.currentTimeMillis() + " LockA 锁住 obj2");
Thread.sleep(60 * 1000); // 为测试,占用了就不放
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class LockB implements Runnable{
public void run() {
try {
System.out.println(System.currentTimeMillis() + " LockB 开始执行");
while(true){
System.out.println(System.currentTimeMillis() + " LockB 锁住 obj2");
synchronized (Main.obj2) {
System.out.println(System.currentTimeMillis() + " LockB 锁住 obj2");
Thread.sleep(3000); // 此处等待是给A能锁住机会
synchronized (Main.obj1) {
System.out.println(System.currentTimeMillis() + " LockB 锁住 obj1");
Thread.sleep(60 * 1000); // 为测试,占用了就不放
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
堆栈排查死锁
- IDEA左边有个相机的图标,可以打印堆栈信息
- 日志分析结果,deadlock死锁关键字
waiting to lock monitor 0x00000206d33fef48 (object 0x000000076b4100a0, a java.lang.String),
which is held by “Thread-0”
“Thread-0”:
waiting to lock monitor 0x00000206d33fede8 (object 0x000000076b4100d0, a java.lang.String),
which is held by “Thread-1”
Java stack information for the threads listed above:
===================================================
“Thread-1”:
at com.wangchun.LockB.run(Main.java:56)
- waiting to lock <0x000000076b4100a0> (a java.lang.String)
- locked <0x000000076b4100d0> (a java.lang.String)
at java.lang.Thread.run(Thread.java:748)
“Thread-0”:
at com.wangchun.LockA.run(Main.java:37)
- waiting to lock <0x000000076b4100d0> (a java.lang.String)
- locked <0x000000076b4100a0> (a java.lang.String)
at java.lang.Thread.run(Thread.java:748)
Found 1 deadlock.
2021-08-24 00:13:38
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.271-b09 mixed mode):
"DestroyJavaVM" #14 prio=5 os_prio=0 tid=0x00000206b86c7000 nid=0x1b68 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Thread-1" #13 prio=5 os_prio=0 tid=0x00000206d5948000 nid=0x16d8 waiting for monitor entry [0x000000dc6bdfe000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.wangchun.LockB.run(Main.java:56)
- waiting to lock <0x000000076b4100a0> (a java.lang.String)
- locked <0x000000076b4100d0> (a java.lang.String)
at java.lang.Thread.run(Thread.java:748)
"Thread-0" #12 prio=5 os_prio=0 tid=0x00000206d5940000 nid=0x33f4 waiting for monitor entry [0x000000dc6bcfe000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.wangchun.LockA.run(Main.java:37)
- waiting to lock <0x000000076b4100d0> (a java.lang.String)
- locked <0x000000076b4100a0> (a java.lang.String)
at java.lang.Thread.run(Thread.java:748)
"Service Thread" #11 daemon prio=9 os_prio=0 tid=0x00000206d5939800 nid=0x3e04 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C1 CompilerThread3" #10 daemon prio=9 os_prio=2 tid=0x00000206d586e800 nid=0x3364 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x00000206d586a800 nid=0x3b4 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x00000206d586a000 nid=0x270 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x00000206d5867000 nid=0x1d10 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x00000206d5864800 nid=0x2e80 runnable [0x000000dc6b5fe000]
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 <0x000000076b3120a8> (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 <0x000000076b3120a8> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:49)
"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x00000206d3432800 nid=0x1118 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x00000206d342f800 nid=0x3c18 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x00000206d33ff800 nid=0x3cfc in Object.wait() [0x000000dc6b2fe000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000076b188ee0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
- locked <0x000000076b188ee0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)
"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x00000206d33f8800 nid=0x5dc in Object.wait() [0x000000dc6b1ff000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000076b186c00> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:502)
at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
- locked <0x000000076b186c00> (a java.lang.ref.Reference$Lock)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
"VM Thread" os_prio=2 tid=0x00000206d33cf000 nid=0x2214 runnable
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00000206b86e1000 nid=0x2850 runnable
"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00000206b86e2000 nid=0x1614 runnable
"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00000206b86e3800 nid=0x2178 runnable
"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00000206b86e5800 nid=0x308c runnable
"GC task thread#4 (ParallelGC)" os_prio=0 tid=0x00000206b86e6800 nid=0x375c runnable
"GC task thread#5 (ParallelGC)" os_prio=0 tid=0x00000206b86e7800 nid=0x1fe8 runnable
"GC task thread#6 (ParallelGC)" os_prio=0 tid=0x00000206b86ea800 nid=0x3f74 runnable
"GC task thread#7 (ParallelGC)" os_prio=0 tid=0x00000206b86eb800 nid=0x288c runnable
"GC task thread#8 (ParallelGC)" os_prio=0 tid=0x00000206b86ec800 nid=0x2350 runnable
"GC task thread#9 (ParallelGC)" os_prio=0 tid=0x00000206b86ed800 nid=0x1fb0 runnable
"VM Periodic Task Thread" os_prio=2 tid=0x00000206d593e000 nid=0x3a34 waiting on condition
JNI global references: 12
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x00000206d33fef48 (object 0x000000076b4100a0, a java.lang.String),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x00000206d33fede8 (object 0x000000076b4100d0, a java.lang.String),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at com.wangchun.LockB.run(Main.java:56)
- waiting to lock <0x000000076b4100a0> (a java.lang.String)
- locked <0x000000076b4100d0> (a java.lang.String)
at java.lang.Thread.run(Thread.java:748)
"Thread-0":
at com.wangchun.LockA.run(Main.java:37)
- waiting to lock <0x000000076b4100d0> (a java.lang.String)
- locked <0x000000076b4100a0> (a java.lang.String)
at java.lang.Thread.run(Thread.java:748)
Found 1 deadlock.
Heap
PSYoungGen total 76288K, used 10486K [0x000000076b180000, 0x0000000770680000, 0x00000007c0000000)
eden space 65536K, 16% used [0x000000076b180000,0x000000076bbbd950,0x000000076f180000)
from space 10752K, 0% used [0x000000076fc00000,0x000000076fc00000,0x0000000770680000)
to space 10752K, 0% used [0x000000076f180000,0x000000076f180000,0x000000076fc00000)
ParOldGen total 175104K, used 0K [0x00000006c1400000, 0x00000006cbf00000, 0x000000076b180000)
object space 175104K, 0% used [0x00000006c1400000,0x00000006c1400000,0x00000006cbf00000)
Metaspace used 3306K, capacity 4564K, committed 4864K, reserved 1056768K
class space used 361K, capacity 388K, committed 512K, reserved 1048576K