死锁及解决方法

什么叫死锁?

        在多线程中,为了防止多线程竞争共享资源而导致数据混乱,会在操作共享资源之前给他们加上互斥锁,当成功获得锁的线程才能对共享资源进行操作,而得不到锁的线程则等待直到锁被释放。这个就是互斥锁的概念。

        而当两个线程同时对两个不同的共享资源使用两个互斥锁时,可能会出现两个线程同时等待对方释放锁的情况,这样两个线程就会持续相互等待,造成死锁。

造成死锁的条件

造成死锁必须同时满足四个条件:

1.互斥条件

        指的是多个线程不能同时使用同一个资源。当线程A持有了共享资源,线程B就不能持有,若B请求获取这个已经被A占用的共享资源,只能等待,直到A释放资源。

2.持有并等待条件

        当线程A持有了共享资源1时,想要申请共享资源2,但是共享资源2已经被线程B持有了,这时A就处于等待状态,但是等待资源2大的同时并不会释放持有的资源1.

3.不可剥夺条件

        线程A持有了共享资源,在释放之前不会被其线程获取。

4.环路等待条件

        死锁发生时,两个线程获取资源的顺序已经构成环形链。如图:

 

那我们如何避免死锁呢?

        我们知道,死锁的发生必须同时满足4个条件,即:互斥条件、持有并等待条件、不可剥夺条件、环路等待条件。

        所以任意破坏其中一个条件使它不再同时满足即可解决死锁问题。

        常见的我们使用资源有序分配法来破坏环路等待条件,进而解决死锁。

资源有序分配法到底是怎么解决的?

        就是使线程A、B获取共享资源的顺序要一致,就是让线程A先尝试获得资源1,再尝试资源2.而线程B也是先尝试获得资源1,再尝试资源2.这将不会造成环路等待,解决了死锁问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值