代码如下:
public class DeadLock {
private OtherDeadLock otherDeadLock;
private final Object LOCK = new Object();
public DeadLock(OtherDeadLock otherDeadLock) {
this.otherDeadLock = otherDeadLock;
}
public void m1() {
synchronized (LOCK) {
System.out.println("m1");
otherDeadLock.o1();
}
}
public void m2() {
synchronized (LOCK) {
System.out.println("m2");
}
}
}
public class OtherDeadLock {
private final Object LOCK = new Object();
private DeadLock deadLock;
public void o1() {
synchronized (LOCK) {
System.out.println("--------------------o1---");
}
}
public void o2() {
synchronized (LOCK) {
System.out.println("--------------------o2---");
deadLock.m2();
}
}
public void set(DeadLock deadLock) {
this.deadLock = deadLock;
}
}
public class Test {
public static void main(String[] args) {
final OtherDeadLock otherDeadLock = new OtherDeadLock();
final DeadLock deadLock = new DeadLock(otherDeadLock);
otherDeadLock.set(deadLock);
new Thread() {
@Override
public void run() {
while(true) {
deadLock.m1();
}
}
}.start();
new Thread() {
@Override
public void run() {
while(true) {
otherDeadLock.o2();
}
}
}.start();
}
}
运行结果:
m1
--------------------o1---
m1
--------------------o1---
m1
--------------------o1---
m1
--------------------o1---
m1
--------------------o1---
m1
--------------------o1---
m1
--------------------o1---
m1
--------------------o1---
m1
--------------------o1---
m1
--------------------o1---
m1
--------------------o1---
m1
--------------------o1---
m1
--------------------o1---
m1
--------------------o1---
m1
--------------------o2---
运行一会就会卡在那,我们可以通过【jstack pid】将线程堆栈信息导出
我们会发现两个线程彼此持有锁,并且互相等待对方的锁,发生了死锁。