jconsole和jvisualvm可视化检测死锁

使用jconsole和jvisualvm可视化检测死锁

  • step1:写死锁
  • step2:检测死锁

死锁程序:

package demo2;

public class DeadLock extends Thread{

    private String name;

    public DeadLock(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        synchronized (this.name) {
            if(this.name.equals("张三")){
                synchronized ("筷子") {
                    System.out.println(Thread.currentThread().getName() + ": " + this.name + "拿到了筷子");
                    synchronized ("碗") {
                        System.out.println(Thread.currentThread().getName() + ": " + this.name + "拿到了碗");
                        System.out.println(Thread.currentThread().getName() + ": 开开心心吃饭饭");
                    }
                }
            }else if(this.name.equals("李四")){
                synchronized ("碗") {
                    System.out.println(Thread.currentThread().getName() + ": " + this.name + "拿到了碗");
                    synchronized ("筷子") {
                        System.out.println(Thread.currentThread().getName() + ": " + this.name + "拿到了筷子");
                        System.out.println(Thread.currentThread().getName() + ": 开开心心吃饭饭");
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        DeadLock t0 = new DeadLock("张三");
        t0.setName("张三的线程");
        DeadLock t1 = new DeadLock("李四");
        t1.setName("李四的线程");
        t0.start();
        t1.start();
    }

}

死锁结果:
这里写图片描述

本来想要的结果:
这里写图片描述

在平时的程序中,如果涉及到死锁的问题,难免需要去检测一下,在JDK中有两个工具,jconsole是Sun公司之前写的,jvisualvm是后期Oracle开发的,都可以使用,灰常的好用。

jconsole:

工具路径:D:\Java\jdk1.7.0_72\bin\

这里写图片描述

选中你的运行进程,进行连接

这里写图片描述

选中进程窗口,点击检测死锁

这里写图片描述

检测结果,死锁,以及其死锁线程
这里写图片描述
这里写图片描述

jvisualvm:

界面还是很友好的,和jconsole差不多,但是可以生成详细的Dump
这里写图片描述

猜你喜欢

转载自blog.csdn.net/xiaheshun/article/details/79926513
今日推荐