Java多线程产生死锁的必要条件

 更新时间:2019年01月07日 12:02:42   作者:李灿辉  
今天小编就为大家分享一篇关于Java多线程产生死锁的必要条件,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。

死锁是操作系统里里面的一个重要的概念,死锁通常发生在并发的场景里。

死锁是多个进程或线程,彼此争抢资源而陷入僵局的一种情况。

在笔者参加的多次面试中,发现不少候选人虽然大概知道死锁是一种因为争抢资源引起的问题,但真的要写一个死锁的例子的话,还是有不少候选人不知道该如何下手。

其实,真正理清楚了死锁产生的必要的条件,写出一个死锁的例子并不困难。那么,就java的多线程而言,产生死锁有哪些必要条件呢?

  • 1,必须有2个或以上的线程。一个线程是不会产生死锁的,它顶多产生等待。
  • 2,必须有2个临界资源,即,必须有2个锁。这也是死锁产生的必要的条件。当只有一个临界资源,或者说只有一个锁时,当一个线程获取了锁,另一个线程虽然暂时无法获取锁,但它至多也就是需要进行等待。而不会陷入死锁。
  • 3,两个线程,每个线程都获取了其中的一个锁,但为了完成工作,还需对方的另一个锁。这种情况下,才会产生死锁。这种情况也称为循环等待。
  • 4,不可剥夺。

以上即为死锁产生的必要条件。

避免死锁可以概括成三种方法:

  • 固定加锁的顺序(针对锁顺序死锁)
  • 开放调用(针对对象之间协作造成的死锁)
  • 使用定时锁-->tryLock()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • Java中HashMap集合的常用方法详解

    Java中HashMap集合的常用方法详解

    本篇文章给大家带来的内容是关于Java中HashMap集合的常用方法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。下面我们就来学习一下吧
    2021-11-11
  • Spring Cloud Stream微服务消息框架原理及实例解析

    Spring Cloud Stream微服务消息框架原理及实例解析

    这篇文章主要介绍了Spring Cloud Stream微服务消息框架原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 实例详解SpringBoot默认的JSON解析方案

    实例详解SpringBoot默认的JSON解析方案

    JSON数据现在是我们开发中用的最多的,百分之九十的数据都是通过JSON方式进行传输,下面这篇文章主要给大家介绍了关于SpringBoot默认的JSON解析方案的相关资料,需要的朋友可以参考下
    2021-08-08
  • 解决lambda表达式内出现异常无法throw抛出的问题

    解决lambda表达式内出现异常无法throw抛出的问题

    这篇文章主要介绍了lambda表达式内出现异常无法throw抛出的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Spring cloud无缝集成Feign的使用示例详解

    Spring cloud无缝集成Feign的使用示例详解

    这篇文章主要为大家介绍了Spring cloud无缝集成Feign的使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 一文详解jvm中的引用类型

    一文详解jvm中的引用类型

    在Java中对象以引用来指向JVM的内存区块,这里我们总结了强引用、软引用、弱引用和假象引用(幽灵引用),下面这篇文章主要给大家介绍了关于jvm中引用类型的相关资料,需要的朋友可以参考下
    2024-04-04
  • Java中常见的日期操作(取值、转换、加减、比较)

    Java中常见的日期操作(取值、转换、加减、比较)

    本文给大家介绍java中常见的日期操作,日期取值、日期转换、日期加减、日期比较,对java日期操作相关知识感兴趣的朋友一起学习吧
    2015-12-12
  • Java 中的 this 和 super 区别

    Java 中的 this 和 super 区别

    这篇文章主要介绍了Javathis与super本质区别,this与super是类实例化时通往Object类通道的打通者;this和super在程序中由于其经常被隐式的使用而被我们忽略,但是理解其作用和使用规范肯定是必须的。接下来将详述this与super的作用和区别,需要的朋友可以参考一下
    2021-11-11
  • 详解SpringBoot 添加对JSP的支持(附常见坑点)

    详解SpringBoot 添加对JSP的支持(附常见坑点)

    这篇文章主要介绍了详解SpringBoot 添加对JSP的支持(附常见坑点),非常具有实用价值,需要的朋友可以参考下
    2017-10-10
  • Spring中的两种代理JDK和CGLIB的区别浅谈

    Spring中的两种代理JDK和CGLIB的区别浅谈

    本篇文章中主要介绍了Spring中的两种代理JDK和CGLIB的区别浅谈,详解的介绍了JDK和CGLIB的原理和方法,有需要的朋友可以了解一下
    2017-04-04

最新评论