死锁

什么是死锁

死锁一般发生在多线程的情况下,因为资源争夺会造成线程之间的相互等待,在没有外力的作用下某些线程会一直等待无法工作。

例如:

线程A在获取资源1的情况下期望获取资源2,线程B在获取资源2的情况下期望获取资源1,这样线程A和B就处于了相互等待的状态。

死锁产生的四个必要条件

互斥条件

多个线程无法共享同一个资源,线程A持有的资源无法再由线程B获取。

持有并等待条件

线程A持有资源1但是又去请求资源2,此时资源2被线程C持有,那么线程A处于持有并等待状态,此时线程B期望获取资源1,B也进入了持有并等待状态。

不可剥夺条件

线程A在持有资源1后,资源1不可由线程B抢占。

环路等待条件

在发生死锁时必然存在一个线程间的环形等待链。

如:线程A在获取资源1的情况下期望获取资源2,线程B在获取资源2的情况下期望获取资源1,此时形成环路等待。

如何避免死锁

其实只要破坏上述条件的一环死锁都不会产生,一般我们使用资源有序分配方法来避免环路等待条件的产生。

上述例子:线程A在获取资源1的情况下期望获取资源2,线程B在获取资源2的情况下期望获取资源1。就不是一个有序使用资源的例子

修改成线程A先尝试获取资源1同时期望资源2,线程B同样也是先尝试获取资源1的同时期望获取资源2。

也就是说线程总是以相同的顺序来请求自己想要的资源而不是逆序就是有序的资源分配。