死鎖定位及分析

  • 什麼是死鎖?

死鎖指兩個或兩個以上的線程在執行過程中,因爭奪資源而造成的一種互相等待的現象

如:

線程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 進程號  查看程序運行信息

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章