什么是线程锁,什么是死锁,解决死锁的办法。

本文介绍了死锁的概念,即进程执行中因竞争资源或通信造成的阻塞现象。阐述了死锁的四个必要条件,包括互斥、持有、不可剥夺和环形等待。还给出避免死锁的方法,如引入事务机制消除部分条件,约定上锁顺序消除环形等待条件。

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

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

   **死锁的条件:**

死锁的四个必要条件

在计算机专业的本科教材中,通常都会介绍死锁的四个必要条件。这四个条件缺一不可,或者说只要破坏了其中任何一个条件,死锁就不可能发生。我们来复习一下,这四个条件是:
•互斥(Mutual exclusion):存在这样一种资源,它在某个时刻只能被分配给一个执行绪(也称为线程)使用;
•持有(Hold and wait):当请求的资源已被占用从而导致执行绪阻塞时,资源占用者不但无需释放该资源,而且还可以继续请求更多资源;
•不可剥夺(No preemption):执行绪获得到的互斥资源不可被强行剥夺,换句话说,只有资源占用者自己才能释放资源;
•环形等待(Circular wait):若干执行绪以不同的次序获取互斥资源,从而形成环形等待的局面,想象在由多个执行绪组成的环形链中,每个执行绪都在等待下一个执行绪释放它持有死锁:指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去

怎么避免死锁:

解除死锁的必要条件

不难看出,在死锁的四个必要条件中,第二、三和四项条件比较容易消除。通过引入事务机制,往往可以消除第二、三两项条件,方法是将所有上锁操作均作为事务对待,一旦开始上锁,即确保全部操作均可回退,同时通过锁管理器检测死锁,并剥夺资源(回退事务)。这种做法有时会造成较大开销,而且也需要对上锁模式进行较多改动。

消除第四项条件是比较容易且代价较低的办法。具体来说这种方法约定:上锁的顺序必须一致。具体来说,我们人为地给锁指定一种类似“水位”的方向性属性。无论已持有任何锁,该执行绪所有的上锁操作,必须按照一致的先后顺序从低到高(或从高到低)进行,且在一个系统中,只允许使用一种先后次序。的资源。

### 死锁的概念 死锁是指两个或多个进程在执行过程中,由于竞争资源或者相互通信而造成的一种阻塞现象,此时所有涉及的进程都无法向前推进[^3]。具体来说,当一组进程中的每一个都在等待仅由该组进程中的其他成员所占用的资源被释放时,则认为发生了死锁。 ### 操作系统层面的解决方案 操作系统提供了多种方式来应对可能出现的死锁情况: #### 1. 死锁预防 这种方法试图破坏形成死锁的一个必要条件——持有并等待、循环等待链路、互斥使用资源和非剥夺性分配。例如,可以规定任何请求新资源之前必须先放弃当前持有的全部资源,以此打破“持有并等待”的条件[^1]。 #### 2. 死锁避免 此策略是在每次分配资源前检查系统的状态是否会进入不安全区,即是否存在潜在的死锁定局面。银行家算法就是一个典型的例子,它能够预测未来的资源需求,并决定是否应该满足某个特定的任务请求以防止未来可能产生的死锁状况。 #### 3. 死锁检测与恢复 不同于上述两种主动防御的方式,这种方式允许暂时性的死锁存在,之后再通过周期性扫描发现死锁的存在并通过某种手段(如撤销部分作业)使受影响的过程恢复正常运行。对于那些未采取预防或避免措施的操作环境而言,这是唯一可行的选择[^2]。 ### 并发编程中的实践建议 为了减少并发程序中出现死锁的风险,在设计阶段就应该考虑以下几个方面: - **最小化共享资源的数量**:尽可能降低不同线程间共用的数据量。 - **合理规划获取/释放顺序**:确保所有的线程按照相同的顺序访问公共资源,这样就可以有效规避循环等待的发生。 - **设置超时机制**:给定时间内未能成功获得所需资源则自动回滚操作,从而避免无限期地处于等待状态。 ```java try { if (!lock.tryLock(5, TimeUnit.SECONDS)) { // 尝试加锁最多五秒 throw new RuntimeException("Could not acquire lock"); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { if (lock.isHeldByCurrentThread()) { lock.unlock(); // 成功拿到锁后记得解锁 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值