• 0
  • 0
分享
  • 面试官:谈谈什么是死锁?如何解决死锁?——软件测试圈
  • 恬恬圈 2023-11-02 16:52:12 字数 1914 阅读 1016 收藏 0

  死锁就是有一天你回家,拿着一把钥匙使劲往锁眼里面捅,结果钥匙断里面了,所以你就叫开锁师傅要开锁,结果锁给开死了,这就是死锁了。以上仅仅是玩笑话,以下步入正题。

  什么是死锁?

  要了解什么是死锁,要首先明白一点,锁是用来做什么?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内存的变动情况,以及引起变动的原因。在项目追踪内存泄露问题时,很实用。


作者:稀有用户    

来源:http://www.51testing.com/html/22/n-4481522.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   前言  在平常工作中经常在浏览器上进行一系列的上传和下载操作,既然是在浏览器上进行的操作,那么上传和下载操作可以不可以通过selenium进行来完成呢?安静本篇内容就给大家解读下如何通过selenium进行上传和下载操作。  上传操作  通常我们网页上的上传分为input标签和非input标签,其中input标签直接可以通过webdriver中的方法send_keys方法进行直接输入需要上传文件地址,非input标签的话需要借助外部工具进行辅助我们完成上传操作。  input标签  安静先写input标签的HTML上传文件:<!DOCTYPE html> <ht...
            11 11 2185
            分享
          •   在水下拍摄3D图像是很棘手的,因为照明条件不一致,而且水中的颗粒会散射光线并导致失真。研究人员已经创建了一个新颖的原型系统,使用量子技术和LiDAR来克服这些困难。光探测和测距(LiDAR)系统通过测量脉冲激光从物体上反射并返回到系统接收器所需的时间(也称为"飞行时间")来创建图像。LiDAR经常被用来获得用于安全和防御的高清晰度三维图像。  现在,来自英国赫瑞瓦特大学和爱丁堡大学的研究人员已经设计了一个LiDAR系统原型,用于拍摄水下物体的三维图像。该系统使用脉冲绿色激光照亮物体,然后由数千个单光子(量子)探测器来接收反射的激光。  鉴于所使用的探测器数量众多,每秒钟...
            0 0 916
            分享
          •   送你一套免费的性能测试框架搭建的课程!省下的300块,去吃一顿热气腾腾的火锅吧!点击下方链接,答问卷,领课程。链接:http://vote.51testing.com/  研究背景  对于大数据测试和数据库测试,经常会同MySQL、ES等数据库“打交道”。对于测试人员来说,MySQLMySQL语法简单易懂、上手方便,但是ES语法相比之下第一眼就会让人觉得“抓脑壳”(那么多字,键盘都得敲坏)。  那有没有什么工具,安装方便、使用简单、具有一定可视化效果,且能够直接使用MySQL语法查询的呢?那当然有了,安排!  这里给大家介绍两款操作ES的chrome插件工具:elasticsearch-h...
            0 1 1980
            分享
          •   今天采访了一个在游戏行业做测试的同学,他所在的游戏公司是做大型多人在线角色扮演类的游戏,类似传奇游戏。他所在的公司目前有1200多人,是上市公司,目前游戏产品在国内海外都有市场。  因为我是一个对游戏无感的人,所以我就问了一些大家可能会感兴趣的问题,提前帮大家探探路。  PS:以下问题不代表权威或专业发声,只是测试行业的同学的个人感受  1.你感觉游戏测试行业就业如何?  我目前在游戏测试行业做了4年了,软件测试行业太卷了,游戏行业很好找工作,只要做功能测试就可以。但是这个行业对于新人来说跨度挺大的,但是做久了就很好搞了,业务熟悉了,怎么样都可以做,如果你对游戏一些基础的业务都不清楚,公司...
            0 0 983
            分享
          •   背景  最近在测试一个党费系统,项目节点临近,几乎没有测试时间,和PM沟通确认后本次测试主要以找Bug为主,将问题控制在内部,后期再进行用例补充及用例报告编写。这样既能达到给客户一个可控的版本,同时写文档时间也不至于那么紧张。接下来分享下我的应对方案。  内容列表:  · 开会熟悉业务  · 常用功能测试  · 业务测试  · 财务业务知识  一 开会熟悉业务  首先我们举行了一次业务分享会议,主要介绍了这是一个党费管理系统,主要包括收入、上缴、支出、拨款、统计等功能及每个功能的主要使用场景,通过这次会议我确定了3个主要关注点,分别为权限测试即3 个类别组织,...
            0 0 560
            分享
      • 51testing软件测试圈微信