什么是死鎖
死鎖是指兩個(gè)或者兩個(gè)以上的線程在執(zhí)行過程中聊闯,因?yàn)闋?zhēng)奪資源而造成的一種相互等待的現(xiàn)象馅袁,若無外力干涉,那它們都將無法推進(jìn)下去弛针。
DeadLock
代碼舉例
public class DeadLockDemo {
public static void main(String[] args) {
String la = "lock-a";
String lb = "lock-b";
new Thread(new HoldLock(la, lb), "T-A").start();
new Thread(new HoldLock(lb, la), "T-B").start();
}
}
class HoldLock implements Runnable {
private String lockA;
private String lockB;
public HoldLock(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run() {
synchronized (lockA) {
System.out.println(Thread.currentThread().getName() + " >> 持有鎖: " + lockA + " 嘗試獲取: " + lockB);
try {
Thread.sleep(2000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB) {
System.out.println(Thread.currentThread().getName() + " -- 持有鎖: " + lockB + " 嘗試獲取: " + lockA);
}
}
}
}
進(jìn)程卡死
死鎖排查
獲取懷疑產(chǎn)生死鎖的進(jìn)程id
使用jps命令獲取
jps
使用ps命令獲取
ps
打印死鎖堆棧信息
使用jdk自帶的jstack命令獲取堆棧信息
jstack 6911
jstack