今天自己写了个死锁,打算用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(){@Overridepublic 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(){@Overridepublic 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
拉到最后,重点分析这部分内容
为了明显,我在代码修改了线程的名称为AAAA..和BBBB..。简单翻译上面的内容,发现一个java级别的死锁,线程BBB等待一个被线程AAA持有的String对象,线程AAA也等待线程BBB持有的对象那个,所以互锁了!!,虽然没有写是哪个共享资源被锁了,但从这份报告我们知道这些信息:死锁发生在哪个类(仔细看上图,第几行也知道) - 死锁的数量 - 死锁锁了哪个对象(这里所的是String,所以看上去不起眼,如果所的是Student类的话,一眼就能定位到了吧)
最后,如果大家有更好的死锁分析工具及教程推荐,欢迎写在评论区