java併發編程筆記5----使用IDEA的Terminal工具排查死鎖

這是我學習java併發編程做的筆記,附上原課程B站地址:全面深入學習java併發編程,中級程序員進階必會

1.簡單的死鎖程序

以下代碼會導致一個死鎖: t1線程鎖住A對象後申請B對象的鎖,t2線程鎖住B對象後申請A對象鎖,產生矛盾,導致死鎖。
將此代碼運行,然後下一步

/**
 *死鎖的演示與排查
 *
 * */
@Slf4j(topic = "c.Test2")
public class Test2 {

    private static final Object A = new Object();
    private static final Object B = new Object();

    public static void main(String[] args) {

        new Thread(()->{
            synchronized (A){
                log.debug("鎖住A...");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                synchronized (B){
                    log.debug("鎖住B...");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        },"t1").start();

        new Thread(()->{
            synchronized (B){
                log.debug("鎖住B...");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                synchronized (A){
                    log.debug("鎖住A...");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        },"t2").start();


    }
}

2.打開Terminal,輸入jps

點擊打開terminal工具,輸入jps,查看進程id
在這裏插入圖片描述

3.找到對應線程,輸入jstack 對應id

如下:
在這裏插入圖片描述

4.查看打印的信息

下圖的意思就是,t2鎖住了f98的一個對象,需要一個f88的
在這裏插入圖片描述
下圖的意思就是,t1鎖住了f88的一個對象,需要一個f98的,綜合上面的圖,就知道倆兄弟意見不合,各要對方的資源,然後就尬住了,即死鎖。
在這裏插入圖片描述

當然,懶得分析上面獨立的信息也可以往下滑

底下直接就幫你分析好了
在這裏插入圖片描述
以上就是所有啦,告辭我繼續滾去學習了。

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