死锁的典型情况、产生的必要条件和解决方案

前言

死锁:多个线程同时被阻塞,他们中的一个或全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

目录

前言

一、死锁的三种典型情况

(一)一个线程一把锁

(二)两个线程两把锁

(三)N个线程M把锁

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

(一)互斥使用

(二)不可抢占

(三)请求和保持

(四)循环等待

三、死锁的解决方案


一、死锁的三种典型情况

(一)一个线程一把锁

一个线程一把锁,但是都是不可重入锁。该线程争对这个锁连续加锁就会陷入死锁。如:

 

(二)两个线程两把锁

两个线程两把锁,把这两个线程先分别获取一把锁,然后再同时尝试获取对方的锁。

 

(三)N个线程M把锁

 

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

(一)互斥使用

一个线程获取到一把锁之后,别的线程不能获取到这个锁。

(二)不可抢占

锁只能被持有者主动释放,而不能被其他线程直接抢走。

(三)请求和保持

一个线程去尝试获取更多的锁,在获取第二把锁的过程中,会对第一把锁始终保持获取状态。

(四)循环等待

t1 尝试获取 locker2,需要t2 执行完,释放 locker2;

t2 尝试获取 locker1,需要t1 执行完,释放 locker1.

三、死锁的解决方案

对于死锁产生的必要条件中,因为他们是缺一不可的,所以解决其中一个条件,死锁的问题就能被解决。解决死锁最关键的要点是第4点

如果对于获取锁有一个编号,并且规定加锁的顺序,那么死锁的问题就可以解决了。如:

我们规定locker1是第一步加锁,locker2是第二步加锁。那么在t1尝试获取locker2的时候,t2仍然处于申请尝试获取locker1的状态中,没有获取locker2,t1对于locker2的获取就会成功。

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y君的进化史

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值