Java多线程与并发编程:死锁诊断与预防体系(12)

死锁诊断与预防体系:从银行金库到分布式系统



一、死锁的四大必要条件与银行金库管理

1.1 金库操作中的死锁场景

假设银行金库有两道安全门:

申请门2钥匙
申请门1钥匙
持有门1钥匙
持有门2钥匙

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