-
什麼是死鎖?
死鎖指兩個或兩個以上的線程在執行過程中,因爭奪資源而造成的一種互相等待的現象
如:
線程A持有A鎖試圖獲取B鎖
線程B持有B鎖試圖獲取A鎖
-
編寫一個簡單的死鎖程序
/**
* @author ck
* @create 2019-08-12 20:26
*/
public class Deadlock {
private String lockA;
private String lockB;
public Deadlock(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
public void get(){
synchronized (lockA){
System.out.println(Thread.currentThread().getName() + "獲得"+lockA+",嘗試獲取" + lockB);
synchronized (lockB){
}
}
}
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(() -> {
Deadlock deadlock = new Deadlock(lockA,lockB);
deadlock.get();
},"AA").start();
new Thread(() -> {
Deadlock deadlock = new Deadlock(lockB,lockA);
deadlock.get();
},"BB").start();
}
}
運行結果
-
死鎖定位及分析
1.打開命令行終端,切換到程序目錄,使用 jps 指令查看當前正在運行的java程序
2.我們對一些可疑的程序進行分析,使用 jstack 進程號 查看程序運行信息