Skip to content

面试速答(先看这里)

**一句话结论:**死锁是指两个或两个以上的进程(或线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

60秒标准回答:

死锁是指两个或两个以上的进程(或线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程

比如:丈母娘要求先买房才能结婚,但是女婿说先结婚买房

(1) 互斥条件: 一个资源每次只能被一个进程使用

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • 产生死锁的四个必要条件:(1) 互斥条件: 一个资源每次只能被一个进程使用。
  • **数据库死锁的发生:**在数据库中,如果有多个事务并发执行,也是可能发生死锁的。

**记忆锚点:**两个或两个以上的进程 → 永远在互相等待的进程 → 源每次只能被一个进程 → 此时称系统处于死锁 → 态或系统产生了死锁 → 想好解除和预防死锁

关键取舍:

  • 死锁是指两个或两个以上的进程(或线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
  • 比如:丈母娘要求先买房才能结婚,但是女婿说先结婚买房 产生死锁的四个必要条件 (1) 互斥条件: 一个资源每次只能被一个进程使用。
  • (2) 占有且等待: 一个进程因请求资源而阻塞时,对已获得的资源保持不放。

易错提醒:

  • (3)不可强行占有: 进程已获得的资源,在未使用完之前,不能强行剥夺。
  • 想好解除和预防死锁,就避免4个条件同时发生就行了,一般从以下几个方面入手 破坏不可抢占:设置优先级,使优先级高的可以抢占资源 破坏循环等待:保证多个进程(线程)的执行顺序相同即可避免循环等待。

加分表达:

  • 数据库死锁的发生 在数据库中,如果有多个事务并发执行,也是可能发生死锁的。

追问准备:

  • 围绕「两个或两个以上的进程」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「永远在互相等待的进程」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「源每次只能被一个进程」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

死锁是指两个或两个以上的进程(或线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

比如:丈母娘要求先买房才能结婚,但是女婿说先结婚买房

扩展知识 ​

产生死锁的四个必要条件 ​

**(1) 互斥条件:**一个资源每次只能被一个进程使用。

**(2) 占有且等待:**一个进程因请求资源而阻塞时,对已获得的资源保持不放。

**(3)不可强行占有:**进程已获得的资源,在未使用完之前,不能强行剥夺。

**(4) 循环等待条件:**若干进程之间形成一种头尾相接的循环等待资源关系。

如何解除死锁 ​

想好解除和预防死锁,就避免4个条件同时发生就行了,一般从以下几个方面入手

破坏不可抢占:设置优先级,使优先级高的可以抢占资源

破坏循环等待:保证多个进程(线程)的执行顺序相同即可避免循环等待。

如执行顺序都是:A->B->C,那就可以避免循环等待。

最常用的避免方法就是破坏循环等待,就是当我们有多个事务的时候,最好让这几个事务的执行顺序相同。

如事务1:A->B->C ,事务2:C->D->A,这种情况就有可能导致死锁。

即事务1占有了A,等待C,而事务2占有了C在等待A。

所以,要避免死锁就把事务2改为:A -> D-> C。

数据库死锁的发生 ​

在数据库中,如果有多个事务并发执行,也是可能发生死锁的。当事务1持有资源A的锁,但是尝试获取资源B的锁,而事务2持有资源B的锁,尝试获取资源A的锁的时候,这时候就会发生死锁的情况。

发生死锁时,会发生如下异常:

java
Error updating database. Cause: ERR-CODE: [TDDL-4614][ERR_EXECUTE_ON_MYSQL] 

Deadlock found when trying to get lock;

一般对于数据库的死锁,主要是避免发生并发修改。或者可以考虑保证操作的顺序,比如多个事务都是先操作资源A、再操作资源B,这样就能有效的避免死锁。

📄 ✅死锁问题排查过程

打开文档:✅死锁问题排查过程