【Java面试笔记:进阶】18.什么情况下Java程序会产生死锁?如何定位、修复?
死锁(Deadlock)是指两个或多个线程因竞争资源而无限期阻塞的现象。
1. 死锁的定义与产生原因
定义:死锁是一种程序状态,多个线程或进程因循环依赖而永久处于等待状态,无法继续执行。
根据 Coffman 条件,死锁产生需同时满足以下四个必要条件:
- 互斥(Mutual Exclusion):资源同一时间只能被一个线程持有。
- 例如:
synchronized
锁、ReentrantLock
。
- 例如:
- 请求与保持(Hold and Wait):线程持有至少一个资源,同时请求其他线程持有的资源。
- 例如:线程 A 持有锁 X,同时请求锁 Y;线程 B 持有锁 Y,同时请求锁 X。
- 不可剥夺(No Preemption):资源只能由持有线程主动释放,不可强制抢占。
- 循环等待(Circular Wait):线程间形成环形等待链。
2.Java 死锁代码示例
public class DeadlockDemo {private static final Object lockA = new Object();private static final Object lockB = new Object