文昌市网站建设_网站建设公司_UI设计师_seo优化
2025/12/19 19:31:18 网站建设 项目流程

什么是死锁?

  • 死锁是指两个或多个进程(或线程)在执行过程中,因竞争资源而造成的一种相互等待的状态,如果没有外力干预,这些进程将 永远无法继续执行。
通俗理解:
  • 你拿着我需要的资源,我拿着你需要的资源,我们都不愿意先放手,于是一直卡住。

死锁的典型例子

线程 A:拿到锁 L1 → 等待锁 L2
线程 B:拿到锁 L2 → 等待锁 L1
结果:
A 等 B,B 等 A,形成死锁

死锁产生的必要条件(缺一不可):

  1. 互斥条件(Mutual Exclusion):资源同一时刻只能被一个进程占用。如:互斥锁、打印机、数据库行锁
  2. 请求并保持条件(Hold and Wait):一个进程已经持有了至少一个资源,同时还在等待获取其他被占用的资源。在此期间,该进程不会释放已经持有的资源。
  3. 不可剥夺条件(No Preemption):已分配给进程的资源 不能被强制剥夺,只能由进程自己释放。
  4. 循环等待条件(Circular Wait):存在一个进程资源等待环,如:A → B → C → A

如何避免死锁?

思路:破坏死锁的 4 个必要条件之一即可
  1. 破坏“循环等待” —— 最常用,资源统一按顺序申请
所有线程:先申请 L1,再申请 L2

实战中最常见、最有效
2. 破坏“请求并保持”

  • 一次性申请所有需要的资源
  • 或申请不到就全部释放
  1. 破坏“不可剥夺”
  • 设置超时
  • 超时未获取锁就主动释放已有资源
    (如数据库锁超时、Redis 锁超时)
  1. 破坏“互斥”(较少)
  • 使用无锁结构
  • 使用读写锁(读共享)

在不同场景下的死锁

  1. 操作系统
  • 进程竞争 CPU、内存、IO
  • 银行家算法(避免死锁)
  1. 多线程(Python / Java)
lock1.acquire()
lock2.acquire()

若顺序不一致 → 死锁
3. 数据库(MySQL 常考)

事务 A:锁行 1 → 请求行 2
事务 B:锁行 2 → 请求行 1

InnoDB 会检测并 主动回滚一个事务

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询