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的,综合上面的图,就知道俩兄弟意见不合,各要对方的资源,然后就尬住了,即死锁。
在这里插入图片描述

当然,懒得分析上面独立的信息也可以往下滑

底下直接就帮你分析好了
在这里插入图片描述
以上就是所有啦,告辞我继续滚去学习了。

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