面试题答案
一键面试死锁产生的四个必要条件
- 互斥条件:资源在某一时刻只能被一个线程所占有,其他线程若要使用该资源,必须等待资源被释放。例如,资源R1在被线程A持有期间,线程B和C不能同时获取R1。
- 占有并等待条件:线程已经持有了至少一个资源,但又提出了新的资源请求,而该资源被其他线程占有,此时请求线程被阻塞,但对自己已获得的资源保持不放。如线程A持有R1,又请求R2,在等待R2的过程中不释放R1。
- 不可剥夺条件:线程已获得的资源,在未使用完之前,不能被其他线程强行剥夺,只能由该线程自己释放。例如线程B持有的R2,其他线程不能强行拿走,只有线程B主动释放R2。
- 循环等待条件:存在一个线程资源的循环等待链,链中每个线程已获得的资源同时被下一个线程所请求。像线程A等待线程B持有的R2,线程B等待线程C持有的R3,线程C等待线程A持有的R1,形成了循环等待。
预防死锁的方法及破坏条件说明
- 破坏占有并等待条件
- 方法:在所有线程开始执行前,要求它们一次性申请所需的全部资源。例如,让线程A、B、C一开始就申请R1、R2、R3这三个资源,而不是先持有一个再申请其他的。
- 破坏原理:这种方式使得线程不会出现持有部分资源又等待其他资源的情况,从而破坏了占有并等待条件,避免死锁。因为如果有任何一个资源无法获取,所有资源都不会分配给线程,线程也不会开始执行,也就不存在持有部分资源等待其他资源的问题。
- 破坏循环等待条件
- 方法:对资源进行排序,规定所有线程必须按照资源编号从小到大的顺序申请资源。比如,给R1、R2、R3分别编号1、2、3,线程只能先申请1号资源R1,再申请2号资源R2,最后申请3号资源R3。
- 破坏原理:通过这种方式,线程不会形成循环等待链,因为每个线程都按照固定顺序申请资源,不可能出现A等B,B等C,C等A的循环等待情况,从而破坏了循环等待条件。例如线程A申请了R1,要申请R2,线程B申请R2时必须先申请R1(若R1已被A申请,B等待),不会出现B持有R2等待R3,而C持有R3等待R1这种循环等待。
- 破坏不可剥夺条件
- 方法:当一个线程申请资源失败时,释放它已经持有的所有资源。例如线程A持有R1申请R2失败,就释放R1,其他线程就有机会获取R1和R2,打破死锁局面。
- 破坏原理:这种方法打破了不可剥夺条件,因为线程持有的资源可以被强制释放,使得其他线程有机会获取资源,避免了因资源无法被剥夺而导致的死锁。