原因:死鎖是指兩個或者兩個以上的線程在執行過程中因爭奪資源而造成的一種互相等待的現象,如無外力干涉他們都無法繼續運行下去。
示意圖如下:
一個死鎖的例子:
/**
* @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,然後看到如下信息。
拉到結尾,看到
說明出現死鎖了。
堅持奮鬥,不負韶華。