1、死锁案例

public class DeadLock {

final Object lockA = new Object();

public static void main(String[] args) {

DeadLock demo = new DeadLock();

demo.startLock();

}

public void startLock() {

ThreadA a = new ThreadA(lockA, lockB);

ThreadB b = new ThreadB(lockA, lockB);

a.start();

b.start();

}

}

class ThreadA extends Thread {

private Object lockA = null;

private Object lockB = null;

public ThreadA(Object a, Object b) {

this.lockA = a;

this.lockB = b;

}

public void run() {

synchronized (lockA) {

System.out.println("---- Thread A: locked A");

try {

sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

synchronized (lockB) {

System.out.println("---- Thread A: locked B");

}

}

System.out.println("---- Thread A: Finished");

}

}

class ThreadB extends Thread {

private Object lockA = null;

private Object lockB = null;

public ThreadB(Object a, Object b) {

this.lockA = a;

this.lockB = b;

}

public void run() {

synchronized (lockB) {

System.out.println("---- Thread B: locked B");

try {

sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

synchronized (lockA) {

System.out.println("Tread B: locked A");

}

}

System.out.println("---- Thread B: Finished");

}

}

2、死锁分析

打印Thread Dump

linux 环境kill -3 pid 或者jstack

windows环境 ctrl+fn+b

dump信息如下:

D:\test\deadlock>java DeadLock

---- Thread A: locked A

---- Thread B: locked B

2018-07-14 17:45:52

Full thread dump Java HotSpot(TM) Client VM (24.65-b04 mixed mode, sharing):

"DestroyJavaVM" prio=6 tid=0x02c4bc00 nid=0x1548 waiting on condition [0x00000000]

  java.lang.Thread.State: RUNNABLE

"Thread-1" prio=6 tid=0x02d2b400 nid=0x2b24 waiting for monitor entry [0x054bf000]

  java.lang.Thread.State: BLOCKED (on object monitor)

       at ThreadB.run(DeadLock.java:64)

       - waiting to lock <0x252811c0> (a java.lang.Object)

       - locked <0x252811c8> (a java.lang.Object)

"Thread-0" prio=6 tid=0x02d2ac00 nid=0x3640 waiting for monitor entry [0x0542f000]

  java.lang.Thread.State: BLOCKED (on object monitor)

       at ThreadA.run(DeadLock.java:37)

       - waiting to lock <0x252811c8> (a java.lang.Object)

       - locked <0x252811c0> (a java.lang.Object)

"Service Thread" daemon prio=6 tid=0x02cdd800 nid=0x4138 runnable [0x00000000]

  java.lang.Thread.State: RUNNABLE

"C1 CompilerThread0" daemon prio=10 tid=0x02cdc800 nid=0x2324 waiting on condition [0x00000000]

  java.lang.Thread.State: RUNNABLE

"Attach Listener" daemon prio=10 tid=0x02cdac00 nid=0x22dc runnable [0x00000000]

  java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x02d04800 nid=0x2fb0 waiting on condition [0x00000000]

  java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=8 tid=0x02c70000 nid=0x708 in Object.wait() [0x050cf000]

  java.lang.Thread.State: WAITING (on object monitor)

       at java.lang.Object.wait(Native Method)

       - waiting on <0x25200fc8> (a java.lang.ref.ReferenceQueue$Lock)

       at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)

       - locked <0x25200fc8> (a java.lang.ref.ReferenceQueue$Lock)

       at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)

       at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

"Reference Handler" daemon prio=10 tid=0x02c6e800 nid=0xf40 in Object.wait() [0x0503f000]

  java.lang.Thread.State: WAITING (on object monitor)

       at java.lang.Object.wait(Native Method)

       - waiting on <0x25200db0> (a java.lang.ref.Reference$Lock)

       at java.lang.Object.wait(Object.java:503)

       at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)

       - locked <0x25200db0> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=10 tid=0x02c6d400 nid=0x1150 runnable

"VM Periodic Task Thread" prio=10 tid=0x02d16400 nid=0x3130 waiting on condition

JNI global references: 111

Found one Java-level deadlock:

=============================

"Thread-1":

 waiting to lock monitor 0x02c73be4 (object 0x252811c0, a java.lang.Object),

 which is held by "Thread-0"

"Thread-0":

 waiting to lock monitor 0x02c75704 (object 0x252811c8, a java.lang.Object),

 which is held by "Thread-1"

Java stack information for the threads listed above:

===================================================

"Thread-1":

       at ThreadB.run(DeadLock.java:64)

       - waiting to lock <0x252811c0> (a java.lang.Object)

       - locked <0x252811c8> (a java.lang.Object)

"Thread-0":

       at ThreadA.run(DeadLock.java:37)

       - waiting to lock <0x252811c8> (a java.lang.Object)

       - locked <0x252811c0> (a java.lang.Object)

Found 1 deadlock.

Heap

def new generation   total 4928K, used 867K [0x25200000, 0x25750000, 0x2a750000)

 eden space 4416K,  19% used [0x25200000, 0x252d8fe0, 0x25650000)

 from space 512K,   0% used [0x25650000, 0x25650000, 0x256d0000)

 to   space 512K,   0% used [0x256d0000, 0x256d0000, 0x25750000)

tenured generation   total 10944K, used 0K [0x2a750000, 0x2b200000, 0x35200000)

  the space 10944K,   0% used [0x2a750000, 0x2a750000, 0x2a750200, 0x2b200000)

compacting perm gen  total 12288K, used 157K [0x35200000, 0x35e00000, 0x39200000)

  the space 12288K,   1% used [0x35200000, 0x35227730, 0x35227800, 0x35e00000)

   ro space 10240K,  44% used [0x39200000, 0x3967a688, 0x3967a800, 0x39c00000)

   rw space 12288K,  52% used [0x39c00000, 0x3a254170, 0x3a254200, 0x3a800000)