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

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

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

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

死锁的产生

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

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

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

死锁的预防

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

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

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

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

死锁的检测

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

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

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



目录
相关文章
|
20天前
|
Java 数据库连接 数据库
不同业务使用同一个线程池发生死锁的技术探讨
【10月更文挑战第6天】在并发编程中,线程池是一种常用的优化手段,用于管理和复用线程资源,减少线程的创建和销毁开销。然而,当多个不同业务场景共用同一个线程池时,可能会引发一系列并发问题,其中死锁就是最为严重的一种。本文将深入探讨不同业务使用同一个线程池发生死锁的原因、影响及解决方案,旨在帮助开发者避免此类陷阱,提升系统的稳定性和可靠性。
38 5
|
2月前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
2月前
|
消息中间件 前端开发 NoSQL
面试官:线程池遇到未处理的异常会崩溃吗?
面试官:线程池遇到未处理的异常会崩溃吗?
70 3
面试官:线程池遇到未处理的异常会崩溃吗?
|
2月前
|
消息中间件 存储 前端开发
面试官:说说停止线程池的执行流程?
面试官:说说停止线程池的执行流程?
47 2
面试官:说说停止线程池的执行流程?
|
2月前
|
消息中间件 前端开发 NoSQL
面试官:如何实现线程池任务编排?
面试官:如何实现线程池任务编排?
31 1
面试官:如何实现线程池任务编排?
|
26天前
|
安全 Java 程序员
【多线程-从零开始-肆】线程安全、加锁和死锁
【多线程-从零开始-肆】线程安全、加锁和死锁
36 0
|
3月前
|
Java
【多线程面试题二十五】、说说你对AQS的理解
这篇文章阐述了对Java中的AbstractQueuedSynchronizer(AQS)的理解,AQS是一个用于构建锁和其他同步组件的框架,它通过维护同步状态和FIFO等待队列,以及线程的阻塞与唤醒机制,来实现同步器的高效管理,并且可以通过实现特定的方法来自定义同步组件的行为。
【多线程面试题二十五】、说说你对AQS的理解
|
3月前
|
Java
【多线程面试题十六】、谈谈ReentrantLock的实现原理
这篇文章解释了`ReentrantLock`的实现原理,它基于Java中的`AbstractQueuedSynchronizer`(AQS)构建,通过重写AQS的`tryAcquire`和`tryRelease`方法来实现锁的获取与释放,并详细描述了AQS内部的同步队列和条件队列以及独占模式的工作原理。
【多线程面试题十六】、谈谈ReentrantLock的实现原理
|
3月前
|
消息中间件 缓存 算法
Java多线程面试题总结(上)
进程和线程是操作系统管理程序执行的基本单位,二者有明显区别: 1. **定义与基本单位**:进程是资源分配的基本单位,拥有独立的内存空间;线程是调度和执行的基本单位,共享所属进程的资源。 2. **独立性与资源共享**:进程间相互独立,通信需显式机制;线程共享进程资源,通信更直接快捷。 3. **管理与调度**:进程管理复杂,线程管理更灵活。 4. **并发与并行**:进程并发执行,提高资源利用率;线程不仅并发还能并行执行,提升执行效率。 5. **健壮性**:进程更健壮,一个进程崩溃不影响其他进程;线程崩溃可能导致整个进程崩溃。
45 2
|
3月前
|
存储 安全 容器
【多线程面试题二十一】、 分段锁是怎么实现的?
这篇文章解释了分段锁的概念和实现方式,通过将数据分成多个段并在每段数据上使用独立锁,从而降低锁竞争,提高并发访问效率,举例说明了`ConcurrentHashMap`如何使用分段锁技术来实现高并发和线程安全。
【多线程面试题二十一】、 分段锁是怎么实现的?

相关实验场景

更多