IT评测·应用市场-qidao123.com

标题: 死锁的产生以及如何避免 [打印本页]

作者: 卖不甜枣    时间: 2025-3-11 04:55
标题: 死锁的产生以及如何避免
一、死锁的产生原因

死锁是多个线程(或进程)因竞争资源而陷入无限等待的状态,需同时满足以下 四个须要条件

二、典型死锁场景示例

Java 代码示例
  1. public class DeadlockDemo {
  2.     private static final Object lockA = new Object();
  3.     private static final Object lockB = new Object();
  4.     public static void main(String[] args) {
  5.         new Thread(() -> {
  6.             synchronized (lockA) {
  7.                 System.out.println("Thread1 holds lockA");
  8.                 try { Thread.sleep(100); } catch (InterruptedException e) {}
  9.                 synchronized (lockB) {  // 等待Thread2释放lockB
  10.                     System.out.println("Thread1 holds lockB");
  11.                 }
  12.             }
  13.         }).start();
  14.         new Thread(() -> {
  15.             synchronized (lockB) {
  16.                 System.out.println("Thread2 holds lockB");
  17.                 try { Thread.sleep(100); } catch (InterruptedException e) {}
  18.                 synchronized (lockA) {  // 等待Thread1释放lockA
  19.                     System.out.println("Thread2 holds lockA");
  20.                 }
  21.             }
  22.         }).start();
  23.     }
  24. }
复制代码
结果
两个线程互相等待对方释放锁,程序无限卡死。

三、死锁的检测与诊断

1. 使用工具检测死锁


2. 日记分析

若日记中线程长时间处于 BLOCKED 状态且无进展,大概发存亡锁。

四、死锁的避免战略

1. 破坏“请求与保持”条件


2. 破坏“不可剥夺”条件


3. 破坏“循环等待”条件


4. 使用超时机制


5. 镌汰锁的粒度



五、最佳实践总结

战略适用场景长处缺点资源有序分配多锁交叉申请场景简朴有用,预防循环等待需全局统一次序,大概限制灵活性超时机制高并发、答应重试的场景避免无限等待,提升体系结实性需处理超时重试逻辑无锁编程(CAS、原子类)低竞争、简朴操纵场景高性能,无死锁风险复杂逻辑实现困难事务回滚数据库、支持回滚的操纵保证数据同等性实现资本高
六、总结

死锁的避免需联合业务场景选择符合的战略:

通过代码规范、工具检测和设计优化,可显著降低死锁发生概率。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4