什么叫死锁?
在多线程中,为了防止多线程竞争共享资源而导致数据混乱,会在操作共享资源之前给他们加上互斥锁,当成功获得锁的线程才能对共享资源进行操作,而得不到锁的线程则等待直到锁被释放。这个就是互斥锁的概念。
而当两个线程同时对两个不同的共享资源使用两个互斥锁时,可能会出现两个线程同时等待对方释放锁的情况,这样两个线程就会持续相互等待,造成死锁。
造成死锁的条件
造成死锁必须同时满足四个条件:
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.这将不会造成环路等待,解决了死锁问题。