死锁的根本原因

本文探讨了死锁发生的四个必要条件,并提出三种预防死锁的方法:破坏占有且等待、破坏不可抢占和破坏循环等待。通过资源有序分配策略可以有效避免循环等待导致的死锁问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

出现死锁要满足的条件

1、互斥使用:即当资源被一个线程使用时,别的线程不能使用
2、不可抢占:资源求生者不能强制从资源占有者手中夺取资源
3、占有且等待:占有且等待即当资源请求其他资源的同时,保持对原有资源的占有
4、循环等待:循环等待即线程一等待线程二占有的资源,而线程二要等待的线程一占用的资源形成一个环路

死锁只有当这四个条件都发生时才可能出现,也就是说只要对其中一个条件进行破坏就能预防死锁,一般我们都不会对互斥条件进行破坏,因为某些资源就只能一个人使用,不能同时多人使用,像实现中的打印机,所有我们对其他三个条件进行破坏

预防死锁

1、破坏占有且等待:(包括占有前等待)每一个请求的一次性申请所有需要的资源,如果无法一次性申请所有资源,那就进行等待
在这里插入图片描述

2、破坏不可抢占:当某个线程拿到一部分资源之后要去申请另一个资源时,如果申请不到,就主动释放它占有的所有资源
在这里插入图片描述

3、破坏循环等待:采用资源有序分配其基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程。
在这里插入图片描述

演示死锁

public class Deadlock {
    public static void main(String[] args) {
        Object a = new Object();	//A资源
        Object b = new Object();	//B资源
        new Thread(()->{
            synchronized (a){
                System.out.println(Thread.currentThread().getName()+"i get a");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"i want b");
                synchronized (b){
                    System.out.println(Thread.currentThread().getName()+"i get b");
                }
            }
        }).start();

        new Thread(()->{
            synchronized (b){
                System.out.println(Thread.currentThread().getName()+"i get b");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"i want a");
                synchronized (a){
                    System.out.println(Thread.currentThread().getName()+"i get a");
                }
            }
        }).start();
    }
}

在这里插入图片描述

安全状态: https://blog.csdn.net/jyy305/article/details/70077042.

### 计算机系统中死锁根本原因 计算机系统中的死锁是一种特殊的状态,其中一组进程互相等待对方释放资源,导致所有相关进程都无法继续执行。这种现象的根本原因是有限的资源共享以及不恰当的资源分配方式[^5]。 #### 死锁形成的四个必要条件 为了深入理解死锁根本原因,必须分析其形成的四个必要条件: 1. **互斥条件** 至少有一个资源在任意时刻只能被一个进程占用。如果其他进程试图访问该资源,则会被阻塞直到当前占有者释放资源。这一条件通常难以避免,因为在许多情况下,某些资源本质上就是不可共享的,例如打印机或磁带机[^2]。 2. **持有并等待条件** 发生死锁时,至少存在一个已持有部分资源的进程正在等待额外资源,而这些资源已经被其他进程占据。这意味着在一个进程中,资源既未完全释放也未全部获得的情况可能导致死锁的发生[^4]。 3. **不可剥夺条件** 已经分配给某个进程的资源不能强制回收,只有在其主动释放后才能重新分配给其他进程。对于像CPU这样的可剥夺资源来说,这种情况较少见;但对于打印机等不可剥夺资源而言,这是一个重要的限制因素。 4. **循环等待条件** 存在一个由两个或更多进程组成的环路结构,在这个环路上每一个进程都在等待下一个进程所持有的资源。一旦形成了这样一个闭环依赖关系,就不可避免地进入了死锁状态[^4]。 以上四个条件共同作用构成了死锁的基础框架。只要这四个条件同时成立,就会引发死锁问题。因此,在设计和管理计算机系统的资源分配策略时,可以通过破坏其中一个或多于一个条件来预防或者解决潜在的死锁隐患。 ```python def is_deadlock_possible(mutex, hold_and_wait, non_preemptive, circular_wait): """ 判断是否存在死锁的可能性。 参数: mutex (bool): 是否有互斥条件 hold_and_wait (bool): 是否有持有并等待条件 non_preemptive (bool): 是否有不可剥夺条件 circular_wait (bool): 是否有循环等待条件 返回: bool: 如果满足所有条件则返回True表示可能发生死锁,否则False """ return all([mutex, hold_and_wait, non_preemptive, circular_wait]) ``` 通过上述函数可以看出,当且仅当所有的输入参数均为`True`时,才会判定为可能存在死锁。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值