什么是死锁
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那他们将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而进入死锁
示例代码
package com.Interview.study.thread;
import java.util.concurrent.TimeUnit;
/**
* @author zhangchaocai
* @create 2020-04-20 18:20
*/
public class DeadLockDemo {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(new HoldLockThread(lockA,lockB),"ThraedAAA").start();
new Thread(new HoldLockThread(lockB,lockA),"ThraedBBB").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() + "\t自己持有" + LockA + "\t 尝试获得:" + LockB);
try{
TimeUnit.SECONDS.sleep(2);
}catch (InterruptedException e ){
e.printStackTrace();
}
synchronized (LockB){
System.out.println(Thread.currentThread().getName() + "\t自己持有" +LockB+ "\t 尝试获得:"+ LockA);
}
}
}
}
可以看到运行并没有结束,造成死锁
jps -l 和 jstack 端口 排查错误原因
假如我们不知道现在异常的原因
我们用上面两个命令排查下这个异常
打开IDEA控制台的 Terminal
1 输入jps -l 查看我们出错类的端口
2 输入 jstack 6060(填你的端口号),如下图2 可以清楚的看到,异常的原因是死锁