![](https://img2022.cnblogs.com/blog/1349485/202205/1349485-20220519221304934-29485043.png)
产生死锁的原因:
1.系统资源不足
2.进程进行推进的顺序不合适
3.资源分配不当
按照图示写个死锁:
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() {
//重点2:锁住其中一个去获取另外一个的锁
synchronized (lockA){
System.out.println(Thread.currentThread().getName()+"已经持有"+lockA+" 尝试获取"+lockB);
synchronized (lockB){
System.out.println(Thread.currentThread().getName()+"获取到了"+lockB);
}
}
}
}
public class DeadLockDemo {
public static void main(String[] args) {
//重点3:创建两个线程去分别获取对方的锁,因为此时对方锁可能被占用着,导致死锁
new Thread(new HoldLockThread("A锁","B锁"),"A线程").start();
new Thread(new HoldLockThread("B锁","A锁"),"B线程").start();
}
}
如何排查死锁问题呢:
使用:JPS命令(查询进程号)
jstack (进程号,查看问题所在)
得出来的结论:发现是死锁
"B线程" #12 prio=5 os_prio=0 tid=0x0 00000001b059000 nid=0xae50 waiting for monitor entry [0x000000001bc0f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at deadLock.HoldLockThread.run(DeadLockDemo.java:17)
- waiting to lock <0x00000007818e1038> (a java.lang.String)
- locked <0x00000007818e1068> (a java.lang.String)
at java.lang.Thread.run(Thread.java:745)
"A线程" #11 prio=5 os_prio=0 tid=0x000000001b056800 nid=0xe30c waiting for monitor entry [0x000000001bb0e000]
java.lang.Thread.State: BLOCKED (on object monitor)
at deadLock.HoldLockThread.run(DeadLockDemo.java:17)
- waiting to lock <0x00000007818e1068> (a java.lang.String)
- locked <0x00000007818e1038> (a java.lang.String)
at java.lang.Thread.run(Thread.java:745)
![](https://img2022.cnblogs.com/blog/1349485/202205/1349485-20220519221332261-1955180221.png)