Java开发之——线程面试篇:死锁和如何避免死锁?

本文探讨了Java开发中线程死锁的概念、产生的四个必要条件及常见代码示例。通过分析死锁原因,提出保持加锁顺序、设置锁获取时限和进行死锁检测等避免死锁的方法,并介绍了使用jstack进行死锁检测的步骤。
摘要由CSDN通过智能技术生成

在这里插入图片描述

在面试的时候在问起线程锁的部分,经常被问到“什么是死锁”、“怎么避免死锁”之类的问题,甚至开发中在使用锁的时候因为逻辑不严谨导致出现程序无法正确终止或者执行的情况,这些都跟死锁有着不可分割的联系,这篇文章我们就来说说死锁的问题。

  1. 什么是死锁

死锁就是当两个或两个以上的线程因竞争相同资源而处于无限期的等待,这样就导致了多个线程的阻塞,出现程序无法正常运行和终止的情况。

举个例子说明下死锁的现象:小明和小张要玩一个玩具,这个玩具有两部分组成必须两部分组装起来才能玩,小明拿了第一部分,小张拿了第二部分;这时候小明等着小张给他第二部分进行组装玩,而小张也等着小明把第一部分给他进行组装玩;两个人都占用着资源谁也不给谁一部分,那么就出现了小明、小张都玩不成的情况;

换成线程中出现死锁解释也是这样,如图:

图片

现在有两个线程A和线程B,线程A通过同步等方式获取了锁1,线程B获取了锁2;在持有锁1的情况下线程A想要再获取锁2,同样的在持有锁2的情况下线程B也想要获取锁1,但是现在锁1和锁2都被线程锁持有并没有被释放,所以就出现了线程A等着线程B释放锁2,线程B等着线程A释放锁1的情况,最终出现两个线程无限期的等待程序无法终止,那么就造成了死锁。

    • 2
      点赞
    • 15
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值