原因:死锁是指两个或者两个以上的线程在执行过程中因争夺资源而造成的一种互相等待的现象,如无外力干涉他们都无法继续运行下去。
示意图如下:
一个死锁的例子:
/**
* @Author:wrb
* @Date :2020/1/29/9:28
* @Describtion:死锁
**/
public class DeadLockDemo {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(new HoldLockThread(lockA,lockB),"ThreadAA").start();
new Thread(new HoldLockThread(lockB,lockA),"ThreadBB").start();
}
}
class HoldLockThread implements Runnable{
private String lockA;
private String lockB;
public HoldLockThread(String lockeA,String lockeB){
this.lockA=lockeA;
this.lockB=lockeB;
}
@Override
public void run() {
synchronized (lockA){
System.out.println(Thread.currentThread().getName()+"\t自己持有锁:"+lockA+"\t
尝试获得:"+lockB);
try {
TimeUnit.SECONDS.sleep(2);
}catch (Exception e){
e.printStackTrace();
}
synchronized (lockB){
System.out.println(Thread.currentThread().getName()+"\t自己持有
锁:"+lockB+"\t尝试获得:"+lockA);
}
}
}
}
运行结果如下:
现实中如何排查出现死锁:
下面以idea工具为示范:在点击Terminal,输入jps -l,找到相应的出现死锁的类。定位到该类的进程编号,如下图,我的死锁类对应的进程编号是:12828
进程编号,继续输入:jstack 12828,然后看到如下信息。
拉到结尾,看到
说明出现死锁了。
坚持奋斗,不负韶华。