死锁,就是吃着碗里的望着锅里的,
public class DeadSyncDemo {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(new HoldLockThread(lockA,lockB),"aaaa").start();
new Thread(new HoldLockThread(lockB,lockA),"bbbb").start();
}
}
class HoldLockThread implements Runnable {
private String lockA;
private String lockB;
public HoldLockThread(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run() {
synchronized (lockA) {
System.out.println(Thread.currentThread().getName() + "自己持有:" + lockA + "尝试获取:" + lockB);
synchronized (lockB) {
System.out.println("-------------");
}
}
}
public String getLockA() {
return lockA;
}
public void setLockA(String lockA) {
this.lockA = lockA;
}
public String getLockB() {
return lockB;
}
public void setLockB(String lockB) {
this.lockB = lockB;
}
}
结果:
bbbb自己持有:lockB尝试获取:lockA
aaaa自己持有:lockA尝试获取:lockB
-----故障排查;
用jps定位,找出正在运行的进程号,然后用jstack查找问题;
如图,jstack 20736;
看,aaa正在等 0428这个锁,正在持有4060这个锁;
而bbb正在持有0428这个号锁,正在等4060这个锁;
这是故障分析的代码,