死锁的产生与排查:从原理到实战

一、什么是死锁? 1.1 死锁示例 public class DeadlockDemo { private static Object lock1 = new Object(); private static Object lock2 = new Object(); public static void main(String[] args) { // 线程1:先锁lock1,再锁lock2 Thread t1 = new Thread(() -> { synchronized (lock1) { System.out.println("线程1:持有lock1,等待lock2"); sleep(100); // 模拟业务逻辑 synchronized (lock2) { System.out.println("线程1:获取lock2成功"); } } }); // 线程2:先锁lock2,再锁lock1 Thread t2 = new Thread(() -> { synchronized (lock2) { System.out.println("线程2:持有lock2,等待lock1"); sleep(100); synchronized (lock1) { System.out.println("线程2:获取lock1成功"); } } }); t1.start(); t2.start(); // 输出: // 线程1:持有lock1,等待lock2 // 线程2:持有lock2,等待lock1 // ... 程序卡住,发生死锁! } private static void sleep(long millis) { try { Thread.sleep(millis); } catch (InterruptedException e) { e.printStackTrace(); } } } 死锁定义: 两个或多个线程互相持有对方需要的资源,导致所有线程都无法继续执行。 ...

2025-11-20 · maneng

死锁:产生原因与解决方案

什么是死锁? 死锁(Deadlock):两个或多个事务互相等待对方释放锁,形成循环等待,导致所有事务都无法继续执行。 -- 经典死锁场景 事务A:持有锁1,等待锁2 事务B:持有锁2,等待锁1 → 互相等待,形成死锁 死锁产生条件 必须同时满足4个条件: 互斥:资源不能被多个事务同时占用 持有并等待:事务持有锁的同时,等待其他锁 不可剥夺:已获得的锁不能被强制释放 循环等待:事务形成循环等待链 死锁示例 示例1:经典死锁 -- 建表 CREATE TABLE account ( id INT PRIMARY KEY, balance INT ); INSERT INTO account VALUES (1, 1000), (2, 2000); -- 时间线 ┌─────────────────┬─────────────────────────────────┐ │ 事务A │ 事务B │ ├─────────────────┼─────────────────────────────────┤ │ START TRANSACTION│ │ │ UPDATE account │ │ │ SET balance=900 │ │ │ WHERE id=1; │ │ │ -- 持有id=1的锁 │ │ │ │ START TRANSACTION │ │ │ UPDATE account │ │ │ SET balance=1800 │ │ │ WHERE id=2; │ │ │ -- 持有id=2的锁 │ │ UPDATE account │ │ │ SET balance=800 │ │ │ WHERE id=2; │ │ │ -- 等待id=2的锁 │ │ │ │ UPDATE account │ │ │ SET balance=1100 │ │ │ WHERE id=1; │ │ │ -- 等待id=1的锁 │ │ │ -- 死锁! │ └─────────────────┴─────────────────────────────────┘ 死锁检测与处理: ...

2025-01-14 · maneng

如约数科科技工作室

浙ICP备2025203501号

👀 本站总访问量 ...| 👤 访客数 ...| 📅 今日访问 ...