每日面试:经典死锁问题 | 如何解决死锁问题 | 多线程

简介: 每日面试:经典死锁问题 | 如何解决死锁问题 | 多线程

死锁是指两个或两个以上的进程在执行过程中,死死抓住对方需要的资源然后还不撒手造成的一种堵塞的现象,如果没有人去插手可能还会阻塞其他线程的运行,最后导致系统崩溃

网络异常,图片无法展示
|

死锁的产生

死锁的产生需要 同时 满足以下四个条件:

  • 互斥条件:某个资源在某段时间内只能被同一个线程占用
  • 请求和保持条件:一个线程获取到某个资源后保持占有并等待下一个被其他线程所占有的资源
  • 不可抢占条件:线程对已获得的资源在未使用完之前,不能被其他线程剥夺,抢占, 即资源只能在线程完成任务之后自动释放
  • 循环等待条件:发生死锁时,必然存在两个或以上线程占有各自的资源同时等待对方释放资源,从而造成环路等待的情况

线程在产生死锁之后,只能通过外部干预来解决,比如重启,或者 kill线程等

死锁的预防

想要预防死锁就要打破死锁的四个条件,其中互斥条件是锁本身的特性无法被破坏,其他三个条件都可以破坏

对于请求和保持条件:我们可以在对锁的第一次执行的时候一次性的申请所有的资源

对于循环等待条件:我们可以对资源进行排序,使得所有锁都按照一定的顺序进行资源的请求

对于不可抢占条件:当占有部分资源的锁进一步的申请其他资源的时候,如果申请不到或者超时则放弃主动释放所占有的资源

死锁的检测

出现死锁以后,有以下两种方法去对死锁进行检测以及定位

1.可以通过 jstack命令去到处现成的 dump日志,然后从 dump日志中定位到具体思索的程序代码

2.通过 JDK自带的 JConsole可视化监视工具连接正在运行的本地或者远程的JVM,对运行在Java应用程序的线程进行远程连接并进行死锁检测功能



目录
相关文章
|
1天前
|
并行计算 算法 安全
面试必问的多线程优化技巧与实战
多线程编程是现代软件开发中不可或缺的一部分,特别是在处理高并发场景和优化程序性能时。作为Java开发者,掌握多线程优化技巧不仅能够提升程序的执行效率,还能在面试中脱颖而出。本文将从多线程基础、线程与进程的区别、多线程的优势出发,深入探讨如何避免死锁与竞态条件、线程间的通信机制、线程池的使用优势、线程优化算法与数据结构的选择,以及硬件加速技术。通过多个Java示例,我们将揭示这些技术的底层原理与实现方法。
21 3
|
1月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
SQL 算法 关系型数据库
面试:什么是死锁,如何避免或解决死锁;MySQL中的死锁现象,MySQL死锁如何解决
面试:什么是死锁,死锁产生的四个必要条件,如何避免或解决死锁;数据库锁,锁分类,控制事务;MySQL中的死锁现象,MySQL死锁如何解决
|
3月前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
|
3月前
|
消息中间件 前端开发 NoSQL
面试官:线程池遇到未处理的异常会崩溃吗?
面试官:线程池遇到未处理的异常会崩溃吗?
86 3
面试官:线程池遇到未处理的异常会崩溃吗?
|
3月前
|
消息中间件 存储 前端开发
面试官:说说停止线程池的执行流程?
面试官:说说停止线程池的执行流程?
57 2
面试官:说说停止线程池的执行流程?
|
3月前
|
消息中间件 前端开发 NoSQL
面试官:如何实现线程池任务编排?
面试官:如何实现线程池任务编排?
45 1
面试官:如何实现线程池任务编排?
|
4月前
|
Java
【多线程面试题二十五】、说说你对AQS的理解
这篇文章阐述了对Java中的AbstractQueuedSynchronizer(AQS)的理解,AQS是一个用于构建锁和其他同步组件的框架,它通过维护同步状态和FIFO等待队列,以及线程的阻塞与唤醒机制,来实现同步器的高效管理,并且可以通过实现特定的方法来自定义同步组件的行为。
【多线程面试题二十五】、说说你对AQS的理解
|
2月前
|
安全 Java 程序员
【多线程-从零开始-肆】线程安全、加锁和死锁
【多线程-从零开始-肆】线程安全、加锁和死锁
56 0
|
4月前
|
消息中间件 缓存 算法
Java多线程面试题总结(上)
进程和线程是操作系统管理程序执行的基本单位,二者有明显区别: 1. **定义与基本单位**:进程是资源分配的基本单位,拥有独立的内存空间;线程是调度和执行的基本单位,共享所属进程的资源。 2. **独立性与资源共享**:进程间相互独立,通信需显式机制;线程共享进程资源,通信更直接快捷。 3. **管理与调度**:进程管理复杂,线程管理更灵活。 4. **并发与并行**:进程并发执行,提高资源利用率;线程不仅并发还能并行执行,提升执行效率。 5. **健壮性**:进程更健壮,一个进程崩溃不影响其他进程;线程崩溃可能导致整个进程崩溃。
59 2

相关实验场景

更多