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

什么是死锁

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

导致死锁的原因

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

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

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

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

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

如何解决

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

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

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

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

相关推荐
不吃香菜学java6 小时前
Redis的java客户端
java·开发语言·spring boot·redis·缓存
panzer_maus7 小时前
MySQL 索引介绍与索引优化的简单介绍
数据库·mysql
captain3767 小时前
事务___
java·数据库·mysql
怕浪猫7 小时前
2026 年前端工程师面试:一份来自面试官视角的真实复盘
面试
北漂Zachary7 小时前
四大编程语言终极对比
android·java·php·laravel
小江的记录本7 小时前
【网络安全】《网络安全常见攻击与防御》(附:《六大攻击核心特性横向对比表》)
java·网络·人工智能·后端·python·安全·web安全
爱学习的小邓同学7 小时前
MySQL --- MySQL数据类型
数据库·mysql
嗑嗑嗑瓜子的猫8 小时前
Java!它值得!
java·开发语言
2401_895521349 小时前
【Spring Security系列】Spring Security 过滤器详解与基于JDBC的认证实现
java·后端·spring
皮卡蛋炒饭.9 小时前
线程的概念和控制
java·开发语言·jvm