1. 程式人生 > >java如何檢視死鎖

java如何檢視死鎖

首先我們先寫一個死鎖程式

public class DeadLock {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (A.class){
                    System.out.println(Thread.currentThread().getName()+"持有了A類鎖");
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (B.class){
                        System.out.println(Thread.currentThread().getName()+"持有了B類鎖");
                    }
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (B.class){
                    System.out.println(Thread.currentThread().getName()+"持有了B鎖");
                    synchronized (A.class){   System.out.println(Thread.currentThread().getName()+"持有了A鎖");}
                }
            }
        }).start();
    }
}

class A{}
class B{}

程式碼思路:先用執行緒1去獲得A類鎖然後執行緒2獲得B類鎖,此時再去執行執行緒1去獲得B類鎖,發現無法獲得,跳到執行緒2去獲得A類鎖也無法獲得。形成死鎖迴圈

  程式無法終止

我們開啟java 安裝地址開啟bin目錄 

開啟後 

有一個死鎖 點開:

 

我們發現綠色箭頭是752cea90物件也就是我們執行緒1想要獲得物件,而執行緒0佔有

紅色箭頭是7a4556dd物件是我們目前佔有的

看看執行緒0的剛好和執行緒1的相反,形成死鎖。