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状态// BLOCKEDSystem.out.println(threadA.getState());// BLOCKEDSystem.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:38Full 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: RUNNABLEat 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 conditionJNI global references: 12Found 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.HeapPSYoungGen 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 1056768Kclass space used 361K, capacity 388K, committed 512K, reserved 1048576K
