实际开发如何快速定位和解决死锁?
一、死锁的本质与常见场景
1. 死锁的四大必要条件
- 互斥:资源同一时间只能被一个线程持有。
- 占有并等待:线程持有资源的同时请求其他资源。
- 不可抢占:资源只能被持有者主动释放。
- 循环等待:多个线程形成资源的循环依赖链。
2. 常见死锁场景
- 数据库事务死锁:
-- 事务1 BEGIN; UPDATE account SET balance=balance-100 WHERE id=1; -- 锁id=1 UPDATE account SET balance=balance+100 WHERE id=2; -- 等待锁id=2-- 事务2 BEGIN; UPDATE account SET balance=balance-200 WHERE id=2; -- 锁id=2 UPDATE account SET balance=balance+200 WHERE id=1; -- 等待锁id=1
- 多线程代码死锁:
// 线程1 synchronized (lockA) {synchronized (lockB) { ... } }// 线程2 synchronized (lockB) {synchronized