聊聊死锁(一)

55 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 14 天,点击查看活动详情

前言

我们前面好几篇文章都在讲 Java 的锁相关知识,如果对 Java 的锁使用不当的话,很容易引发死锁,从而出现不可预知的后果,造成系统崩溃。今天,我们就先来聊聊,死锁是怎么产生的。知道了死锁产生的条件,我们才能知道如何去预防死锁。

死锁的必要条件

在如何解决死锁之前,我们先来看下发生死锁时有哪些必要的条件。如果要发生死锁,则必须存在以下四个必要条件,四者缺一不可。

互斥条件

在一段时间内某资源仅为一个线程所占有。此时若有其他线程请求该资源,则请求线程只能等待。

不可剥夺条件

线程所获得的资源在未使用完毕之前,不能被其他线程强行夺走,即只能由获得该资源的线程自己来释放(只能是主动释放)。

请求与保持条件

线程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他线程占有,此时请求线程被阻塞,但对自己已获得的 资源保持不放。

循环等待条件

线程 A 持有线程 B 需要的资源,而线程 B 又持有线程 A 需要的资源;两者都在等待对方释放各自所需的资源,但是两者都无法释放。这就是循环等待。

死锁的预防

并发编程中,一旦发生了死锁的现象,则基本没有特别好的解决方法,一般情况下只能重启应用来解决。因此,解决死锁的最好方法就是预防死锁

发生死锁时,必然会存在死锁的四个必要条件。也就是说,如果我们在写程序时,只要“破坏”死锁的四个必要条件中的一个,就能够避免死锁的发生。明天的文章,我们就一起来探讨下如何“破坏”这四个必要条件。