步骤 8 / 9
动手:用等待图找出死锁
T1 先 A 后 B、T2 先 B 后 A,交错时形成环 T1→B→T2→A→T1,就是死锁;两边都改成先 A 后 B,环消失。
右边设定两把锁 A、B,给每个线程排好加锁顺序,然后一步步执行。图里画“等待图”:线程指向它在等的锁,锁指向拿着它的线程。 试 T1: [A, B],T2: [B, A]。T1 拿到 A,T2 拿到 B;接着 T1 要 B(被 T2 拿着),T2 要 A(被 T1 拿着)。 图里出现一个环:T1 等 B,B 在 T2 手里,T2 等 A,A 在 T1 手里。有环就是死锁,谁也不会放手。 注意它不是每次都发生:如果 T1 一口气拿到 A 和 B 再轮到 T2,就没事。这也是死锁难复现的原因。 再把 T2 改成 [A, B]:两个线程都先抢 A,没抢到的连 B 都不会去碰,环不可能形成。这就是“固定加锁顺序”为什么有效。