51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 970|回复: 0
打印 上一主题 下一主题

[原创] 面试官:谈谈什么是死锁?如何解决死锁?

[复制链接]
  • TA的每日心情
    擦汗
    4 小时前
  • 签到天数: 1026 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-3-9 09:17:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    死锁就是有一天你回家,拿着一把钥匙使劲往锁眼里面捅,结果钥匙断里面了,所以你就叫开锁师傅要开锁,结果锁给开死了,这就是死锁了。以上仅仅是玩笑话,以下步入正题。
      什么是死锁?
      要了解什么是死锁,要首先明白一点,锁是用来做什么?Java中的锁说白了,就是为了保证资源安全,确保一次仅有一个线程对共享资源进行修改。(以上仅为个人理解,如有问题,请评论讨论。)那死锁的概念就好理解了,就是有两个及以上的线程对同一个资源进行争夺,结果两个线程没有一个让步,并且没有任何的外力进行协调导致的一种僵局。
      例1:马路上就只有一条道,刚好两辆车都到了,两司机开始吵架说,是我先到的,没有一个让的,而刚好这条路上没有交通警察来协调,于是两司机就吵的不可开交。当然这个例子有失偏颇,但是可以作为一个入门的理解。
      例2: 线程中出现的死锁就是:
      线程A -> 锁a资源 -> 锁b资源
      线程B -> 锁b资源 -> 锁a资源
      结果两个线程同时开启了,导致了A线程拿到a资源不放又同时去请求b资源,而B线程拿到b资源不放同时又去请求b资源。
      以上两个例子对应了线程产生死锁的两种原因。

      死锁产生的原因
      两种原因:
      1.竞争资源不可剥夺资源
      2.进程推进顺序冲突
      刚好有点类似以上的两个例子,读者可以回顾查看一下。


      产生死锁的四个必要条件
      1.互斥条件,进程要求对所分配的资源进行排它性控制,即该资源一次仅能为一个进程所享用。
      2.请求并保持,即该进程对已获得的资源保持不放,又对新的资源保持请求的状态,就像个贪心的人,吃着碗里,看着锅里。
      3.不可剥夺,该资源仅能当前进行释放,偏偏这个贪心的人房产证名字写的是他。
      4.环路等待条件,闭环了,兄弟们,他想要的东西是他老婆的,他老婆又想要他手里的房产证。

      解决死锁的基本方法
      从基本上的思路上来说,无非就是避免死锁,以及如果死锁产生后该如何解决。
      ·预防死锁:
      预防死锁的角度主要是从破坏死锁产生的必要条件入手。
      1.一次性分配所有资源,要什么给什么,直接给完。(破坏条件2)
      2.只要有一个资源不分配,其他资源也不给了。(破坏条件2)
      3.可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏条件3)
      4.资源有序:系统给每类资源进行有序放号,进程则按照这些号码去请求获取资源,释放锁的时候则相反(破坏条件4)
      有什么方案可以进行死锁的预防?
      方案一:超时释放(破坏不可剥夺条件)
      synchronized直接PASS,这玩意请求不到就阻塞。因此我们需要的是可以手动释放锁的LOCK进行释放锁。可以直接使用tryLock中的超时时限用来释放锁。
      方案二: 按计划好的顺序获取锁(破坏环路等待条件)
      就是避免上述的第二个例子,避免首尾相接,按照规划好的获取锁的顺序去获取资源,需要按照具体场景去策划方案。

      · 死锁检测
      1、Jstack命令
      jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
      2、JConsole工具
      JConsole 是一个内置 Java 性能分析器,可以从命令行(直接输入jconsole)或在 GUI shell (jdk\bin下打开)中运行。
      它用于对JVM中内存,线程和类等的监控。可使用JTop插件。它可以监控本地的jvm,也可以监控远程的jvm,也可以同时监控几个jvm。
      这款工具的好处在于,占用系统资源少,而且结合Jstat,可以有效监控到java内存的变动情况,以及引起变动的原因。在项目追踪内存泄露问题时,很实用。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-29 13:28 , Processed in 0.089090 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表