死锁诊断与预防体系:从银行金库到分布式系统
文章目录
一、死锁的四大必要条件与银行金库管理
1.1 金库操作中的死锁场景
假设银行金库有两道安全门:
1.2 必要条件对照表
死锁条件 | 银行场景类比 | 技术实现 |
---|---|---|
互斥访问 | 一次只允许一人进入金库 | synchronized/ReentrantLock |
持有并等待 | 拿着A门钥匙还想要B门 | 嵌套锁请求 |
不可抢占 | 不能强行夺走他人钥匙 | 锁只能自愿释放 |
循环等待 | 两人互相等待对方钥匙 | 资源依赖成环 |
二、死锁诊断:从单机到分布式
2.1 单机诊断工具链
# 1. 查找Java进程
jps -l
# 2. 获取线程转储
jstack <pid> > thread_dump.txt
# 3. 分析死锁(示例输出)
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x00007f3b4800f2b8 (object 0x000000076bf28c58, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x00007f3b4800e2a0 (object 0x000000076bf28c68, a java.lang.Object),
which is held by "Thread-1"
2.2 分布式死锁检测算法
基于时间戳的检测:
# 伪代码实现
class DistributedDetector:
def detect_cycle(self, graph):
for node in graph.nodes:
if self._dfs(node, set(), graph):
return True
return False
def _dfs(self