首页 > 编程语言 > 详细

Java多线程 - 怎么检测到发生死锁?

时间:2021-02-04 09:51:40      阅读:31      评论:0      收藏:0      [点我收藏+]

1-Jconsole 检查死锁

Jconsole是JDK自带的图形化界面工具,使用JDK给我们的的工具JConsole,可以通过打开cmd然后输入jconsole打开。

技术分享图片
        连接到需要查看的进程。

技术分享图片

        打开线程选项卡,然后点击左下角的“检测死锁” 。

技术分享图片
        jconsole就会给我们检测出该线程中造成死锁的线程,点击选中即可查看详情:

技术分享图片

技术分享图片
从上图中我们可以看出:

        在线程Thread-1中,从状态可以看出,它想申请java.lang.Object@35b4e829这个资源,但是这个资源已经被Thread-0拥有了,所以就堵塞了。

        在线程Thread-0中,从状态可以看出,它想申请java.lang.Object@2db8dc9这个资源,但是这个资源已经被Thread-1拥有了,所以就堵塞了。

        Thread-1一直等待java.lang.Object@35b4e829资源,而Thread–0一直等待java.lang.Object@2db8dc9资源,于是这两个线程就这么僵持了下去,造成了死锁。

 

2-VisualVM

1.从线程图中,我们可以很轻易地找到这种可疑特征:两个(或多个)线程长期同时处于”监视(被阻塞)”状态,提示“检查到死锁”说明它们出现了死锁,应当生成dump查到详细内容。
2.生成dump后,在dump的最下面有关于锁的说明

技术分享图片

 

 

 

3-自行维护一个graph来记录申请锁情况

每当一个线程获得了锁,会在线程和锁相关的数据结构中(map、graph等等)将其记下。除此之外,每当有线程请求锁,也需要记录在这个数据结构中。

当一个线程请求锁失败时,这个线程可以遍历锁的关系图看看是否有死锁发生。例如,线程A请求锁7,但是锁7这个时候被线程B持有,这时线程A就可以检查一下线程B是否已经请求了线程A当前所持有的锁。如果线程B确实有这样的请求,那么就是发生了死锁。

Java多线程 - 怎么检测到发生死锁?

原文:https://www.cnblogs.com/frankcui/p/14370515.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!