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

什么是死锁

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

导致死锁的原因

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

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

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

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

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

如何解决

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

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

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

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

相关推荐
℡余晖^5 分钟前
每日面试题18:基本数据类型和引用数据类型的区别
java
熬了夜的程序员18 分钟前
【华为机试】34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·华为od·华为·面试·golang
hello 早上好22 分钟前
消息顺序、消息重复问题
java·中间件
phltxy40 分钟前
ArrayList与顺序表
java·算法
Doris_LMS1 小时前
保姆级别IDEA关联数据库方式、在IDEA中进行数据库的可视化操作(包含图解过程)
java·mysql·postgresql
2301_793086871 小时前
Mysql group by
数据库·mysql
衍生星球1 小时前
JSP 程序设计之 Web 技术基础
java·开发语言·jsp
Java编程乐园1 小时前
Java函数式编程之【Stream终止操作】【下】【三】【收集操作collect()与分组分区】【下游收集器】
java
yinyan13141 小时前
一起学springAI系列一:初体验
java·人工智能·ai
永卿0011 小时前
设计模式-责任链模式
java·设计模式·责任链模式