• Java中的死锁问题,原因,产生条件,避免预防


    目录

    原因

    产生条件

    避免预防


    在Java中,死锁是指两个或多个线程无法继续执行的情况,它们相互等待对方释放资源。这种情况下,程序无法继续运行,导致程序挂起或崩溃。死锁是一种非常常见且有害的并发问题。

    原因

    死锁的原因主要有两个:

    1. 资源占用:每个进程都持有一些资源并继续申请其他资源。当一个进程持有的资源被另一个进程持有,而第二个进程持有的资源被第一个进程持有,两个进程就会相互等待,导致死锁。
    2. 顺序执行:在多线程环境中,如果两个或多个线程需要按照一定的顺序执行,但是它们之间的执行顺序发生了冲突,也会导致死锁。

    产生条件

    死锁的产生需要满足四个条件,这四个条件通常被称为饥饿四条件:

    1. 互斥条件:一个资源每次只能被一个线程使用。
    2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
    3. 不剥夺条件:已经分配的资源,未使用完之前不能强行剥夺。
    4. 环路等待条件:系统中若干个进程形成一种头尾相接的环路,每个进程都在等待下一个进程所占有的资源。

    避免预防

    避免和预防死锁的常见方法有:

    1. 避免使用共享资源:如果可能,尽量避免在并发环境中共享资源。每个线程或进程都使用自己的资源,可以减少死锁的可能性。
    2. 使用锁顺序:为每个资源分配一个唯一的锁,并要求线程请求锁时按照一定的顺序。这样,如果一个线程已经获得了第一个锁,那么它就不能再申请第二个锁,从而防止了死锁。
    3. 使用锁超时:设置一个超时时间,如果线程在一定时间内无法获得它需要的所有锁,它就应该释放它已经获得的锁,然后等待一段随机时间后再次尝试。这种方法不能保证线程一定能够获得它需要的所有锁,但是它可以避免死锁的情况。
    4. 使用信号量:使用信号量来控制对共享资源的访问。信号量是一个整数值,它可以用来表示某个资源可用的数量。当一个线程请求资源时,它需要先获取信号量。如果信号量的值小于资源的数量,那么线程就需要等待直到信号量的值增加。当线程完成对资源的访问后,它需要释放信号量。这种方法可以避免死锁的情况,但是它可能会导致其他的问题,比如饥饿或者活锁。
    5. 使用检测和恢复:定期检查系统是否出现死锁。如果检测到死锁,就恢复执行顺序并重新执行。这种方法可以避免死锁的情况,但是它需要付出一定的性能代价。

    另外就是不要嵌套使用锁 

  • 相关阅读:
    React学习(七)— 路由react-router
    【Linux 进程通信】消息队列
    Flink CDC 菜鸟教程 -环境篇
    Python数据科学实战教程
    Python 教程之控制流(7)Python中的链接比较运算符
    设备树源码(即xxx.dts或xxx.dtsi文件)的格式
    约数相关问题
    国内大语言模型的相对比较:ChatGLM2-6B、BAICHUAN2-7B、通义千问-6B、ChatGPT3.5
    Unity3D UI框架的设计架构与编码实现详解
    华为服务器不能安装Proxmox VE(PVE) 7 的解药来了
  • 原文地址:https://blog.csdn.net/m0_70437378/article/details/134483691