golang的死锁排查
介绍
之前看到的别人用GO语言写了一个死锁检测工具,大概看了一下的实现原理,然后自己就用JAVA写了一次。
原项目链接
作用
在开发调试期,帮助排查程序中的死锁情况。
原理
LockHolder保存了整个进程所有线程与锁之间的持有关系,每次上锁时,都判断一下这次上锁是否会造成死锁,死锁的话抛出异常,并打印相对应的信息。
死锁不一定发生在两个线程之间,有可能出现在多个线程之间交叉出现。
线程A---争取---锁1---属于---线程B---争取---锁2---属于---线程C---争取---锁3---属于---线程A
所以,在检测死锁的时候,递归遍历每层锁与线程的关系,当检测到会形成回路(即发生死锁的时候)的时候,退出递归,报错。
看了一下原作者的实现,好像并不是用递归,等考完试有空再看看原作者是怎么实现检测多个线程之间的锁。
用法
例如,用ReentrantLock,正常开发的时候,我们可