今天自己写了个死锁,打算用Visual IVM分析一下,上网找教程,全部都是教你怎么安装和简单介绍,而我,是看不懂里面写的火星文才百度的啊,所以,只能自己捣鼓了,最后我发现了一丝蛛丝马迹,有助于分析死锁!!!
测试代码,不看代码可以看注释
/**
* 下面写了一个死锁
* 1. thread1锁了A对象,休眠;
* 2. thread2锁了B对象等待A对象;
* 3. thread1醒来,等待B对象
* 4. 大家互相等待,死锁
*/
public class DeadLockDemo {
private static String A = "A";
private static String B = "B";
public static void main(String[] args){
new DeadLockDemo().deadLock1111();
}
private void deadLock() {
Thread t1 = new Thread(new Runnable(){
@Override
public void run(){
synchronized (A){
try {
System.out.println("sleep start");
Thread.currentThread().sleep(5000);
System.out.println("sleep end");
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (B){
System.out.println("thread1 running");
}
}
}
});
Thread t2 = new Thread(new Runnable(){
@Override
public void run() {
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (B){
synchronized (A){
System.out.println("thread2 running");
}
}
}
});
t1.setName("AAAAAAAAAAAAAAAAA");
t2.setName("BBBBBBBBBBBBBBBBB");
t1.start();
t2.start();
}
}
执行结果,然后卡主了,红点表示程序一直在运行(线程在互相等待)
接下来,就到了我们visual IVM出马了!!
来,我们想象这样一个场景,现在我们运行了上面这个项目,我们不知道有死锁可能发生,突然一个用户反映说,程序卡死不懂了,怎么办?(大脑思考:卡死 → 服务停止了 → 死锁) ,哦,可能项目死锁了,那我们打开vimsual ivm看看能否找出一些蛛丝马迹!!!
打开ivm,发现一个明显是自己项目里的文件名出现,出于好奇点开
点开后,打开线程面板页,哟,检测到死锁了,点开dump
扫描二维码关注公众号,回复:
4646737 查看本文章
拉到最后,重点分析这部分内容
为了明显,我在代码修改了线程的名称为AAAA..和BBBB..。简单翻译上面的内容,发现一个java级别的死锁,线程BBB等待一个被线程AAA持有的String对象,线程AAA也等待线程BBB持有的对象那个,所以互锁了!!,虽然没有写是哪个共享资源被锁了,但从这份报告我们知道这些信息:死锁发生在哪个类(仔细看上图,第几行也知道) - 死锁的数量 - 死锁锁了哪个对象(这里所的是String,所以看上去不起眼,如果所的是Student类的话,一眼就能定位到了吧)
最后,如果大家有更好的死锁分析工具及教程推荐,欢迎写在评论区