AI工具人
提示词工程师

死锁

  之前在学校学习过程中,很少写多进程的代码,虽然操作系统中学过死锁相关的内容,但考试过后也基本就忘记了,后来自己也遇到过有些多进程死锁的情况,再加上看了有些资料,对死锁才算是有了有些深入的理解。

### 死锁的产生  
  想起今年年初在面试的时候,有个面试官让我写一段可能会发生死锁的代码,我就写了如下的代码。
```java
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Test {
private static Lock lock1 = new ReentrantLock();
private static Lock lock2 = new ReentrantLock();
public static void fun1() {
try {
lock1.lock();
lock2.lock();
//do something
} catch (Exception e) {
e.printStackTrace();
} finally {
lock1.unlock();
lock2.unlock();
}
}
public static void fun2() {
try {
lock2.lock();
lock1.lock();
//do something
} catch (Exception e) {
e.printStackTrace();
} finally {
lock2.unlock();
lock1.unlock();
}
}
}
```
  以上代码在多线程分别调用fun1()和fun2()的时候有一定几率发生死锁(如果想大概率死锁,可以在获取两次锁之间sleep一段时间)。 假设当thread1执行fun1()并获取到lock1时thread2执行fun2()并已经获取到了lock2,这个时候thread1无法获取到lock2,thread2无法获取到lock1,且双方都不会释放之前获取到的锁,两个进程互相等,谁也不谁,这就产生了死锁。
  所以看起来死锁产生貌似需要多进程争抢某些资源,还需要进入某些互相等待的状态,但是更准确讲,死锁的产生必须依赖四个条件,而且缺一不可。
#### 互斥条件
  多进程使用的资源必须是互斥的,也就是说一个进程在使用过过程中,另一个进程就不能再用了。   
#### 占有和等待
  死锁其实都发生在进程执行都会请求多个资源的情况下,所以要产生死锁就必须得让进程可以在占有某个资源的情况下再去请求其他的资源。  
#### 不可抢占
  已经被某些进程使用中的资源,不能被其他的进程抢占,必须等待使用该资源的进程释放。
#### 环路等待
  就如同上面代码所示,当死锁发生时一定是thread1等thread2,thread2等thread1的情况。真实环境中,不仅限两个进程,只要多个进程相互等待图中出现了环,切满足前三个条件,一定会出现死锁。

  工作中不会写出我上面那么明显的死锁代码,但其实在大型系统中,各种复杂且相互交错的逻辑,难免稍不留神就发生死锁,我们如何预防,如何检测,如何解决死锁呢?

赞(0) 打赏
未经允许不得转载:XINDOO » 死锁
描述文字

评论 抢沙发

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫