定义:
死锁指两个及两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待(阻塞)现象。
图示:
代码:(注:细节都在代码注释中,代码说话多动手)
public class DeadLockDemo {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
//以下两个线程参数顺序不一致 第一个参数代表[已经持有的资源] 第二个参数代表[想要得到的资源]
new Thread(new HoldLockThread(lockA,lockB),"ThreadA").start(); //“线程操作资源类” 这句话在这里体现 ****
new Thread(new HoldLockThread(lockB,lockA),"ThreadB").start(); //自己的理解:“线程是一个载体”
}
}
class HoldLockThread implements Runnable{
private String hadResource; //已经持有的资源
private String togetResouce;//想要得到的资源
public HoldLockThread(String hadResource, String togetResouce) {
this.hadResource = hadResource;
this.togetResouce = togetResouce;
}
@Override
public void run() {
synchronized (hadResource){
System.out.println(Thread.currentThread().getName()+"\t 已经持有"+hadResource+"\t 尝试得到"+togetResouce);
//注意: 这里让线程休眠的目的是为了让另一线程 拿到 第一把锁并尝试得到第二把锁 ********
try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace();}
synchronized (togetResouce){
System.out.println(Thread.currentThread().getName()+"\t 恭喜拿到"+ togetResouce);
}
}
}
}
控制台现象:
两个排查死锁的命令:
①:jps 等同于linux的 ps -ef|grep xxxx java提供的一个显示当前所有java进程pid的命令
②jstack: j用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息
信息详情如下:
写到最后(如果任何问题可联系👇)