[面试] 什么是死锁? 如何解决死锁?

什么是死锁

死锁,简单来说就是两个或者多个的线程在执行的过程中,争夺同一个共享资源造成的相互等待的现象。如果没有外部干预线程会一直阻塞下去.

导致死锁的原因

  1. 互斥条件,共享资源 X 和 Y 只能被一个线程占用;

  2. 请求和保持条件,线程 T1 已经取得共享资源 X,在等待共享资源 Y 的时候,不释放共享资源 X;

  3. 不可抢占条件,其他线程不能强行抢占线程 T1 占有的资源;

  4. 循环等待条件,线程 T1 等待线程 T2 占有的资源,线程 T2 等待线程 T1 占有的资源,就是循环等待。

导致死锁之后,只能通过人工干预来解决,比如重启服务,或者杀掉某个线程 !!!

如何解决

只要打破以上四个条件其中一个就可以解决死锁, 除了互斥条件无法打破

  • 对于"请求和保持"这个条件,我们可以一次性申请所有的资源,这样就不存在等待了。

  • 对于"不可抢占"这个条件,占用部分资源的线程进一步申请其他资源时,如果申不到,可以主动释放它占有的资源,这样不可抢占这个条件就破坏掉了。

  • 对于"循环等待"这个条件,可以靠按序申请资源来预防, 是指资源是有线性顺序的,申请的时候可以先申请资源序号小的,再申请资源序号大的, 这样线性化后自然就不存在循环了。

相关推荐
超级大只老咪27 分钟前
数组相邻元素比较的循环条件(Java竞赛考点)
java
小浣熊熊熊熊熊熊熊丶32 分钟前
《Effective Java》第25条:限制源文件为单个顶级类
java·开发语言·effective java
毕设源码-钟学长44 分钟前
【开题答辩全过程】以 公交管理系统为例,包含答辩的问题和答案
java·eclipse
啃火龙果的兔子1 小时前
JDK 安装配置
java·开发语言
星哥说事1 小时前
应用程序监控:Java 与 Web 应用的实践
java·开发语言
写写闲篇儿1 小时前
微软面试之白板做题
面试·职场和发展
派大鑫wink1 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
xUxIAOrUIII1 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
Dolphin_Home1 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
醇氧1 小时前
org.jetbrains.annotations的@Nullable 学习
java·开发语言·学习·intellij-idea