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

  什么是死锁?

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

-每天学习一点,今后必成大神-

关注下方公众号,领取海量软件测试学习资料

面试官:谈谈什么是死锁?如何解决死锁?相关推荐

  1. 面试官:谈谈分库分表吧?

    面试官:"有并发的经验没?"  应聘者:"有一点."   面试官:"那你们为了处理并发,做了哪些优化?"   应聘者:"前后端分离 ...

  2. 联合索引会创建几个索引_面试官:谈谈你对mysql联合索引的认识?

    引言 这篇文章作为<面试官:谈谈你对mysql索引的认识>的续篇,我当时在写这篇的时候,考虑到篇幅问题所以略去了联合索引的内容,今天给大家补上. 本文预计分为两个部分:(1)联合索引部分的 ...

  3. linux下死锁怎么解决方法,死锁,解决死锁的4种基本方法

    死锁,解决死锁的4种基本方法 死锁 这个概念是操作系统里面很重要的内容,前阵子面试字节被问到了,太久没复习,面经变凉经. 死锁(Deadlock),又被翻译为死结.是操作系统或软件运行的一种状态,在多 ...

  4. redis desktop manager_面试官:Redis分布式锁如何解决锁超时问题?

    Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:wangzaiplus 来源:https://www.jianshu.com/u/8cb4591440ca 一.前言 关 ...

  5. redis续期_面试官:Redis分布式锁如何解决锁超时问题的?

    一.前言 关于redis分布式锁, 查了很多资料, 发现很多只是实现了最基础的功能, 但是, 并没有解决当锁已超时而业务逻辑还未执行完的问题, 这样会导致: A线程超时时间设为10s(为了解决死锁问题 ...

  6. 面试官: 谈谈什么是守护线程以及作用 ?

    来自:小哈学Java 目录 一.什么是守护线程 二.守护线程的作用及应用场景 三.总结 一.什么是守护线程 守护线程相对于正常线程来说,是比较特殊的一类线程,那么它特殊在哪里呢?别急,在了解它之前,我 ...

  7. java死锁_Java死锁原理,手写死锁,解决死锁

    死锁:多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能进行,而导致两个或者多个线程都在等在对方释放资源. 都停止的情形.某一个同步块同时拥有两个以上对象的锁时,就会产生死锁问题. 手写 ...

  8. java避免活锁.死锁的解决,死锁 活锁 饥饿 出现原因及解决方案

    文章目录 死锁 概念 死锁示例 为什么会出现死锁呢? 如何解决死锁呢? 解决死锁代码实现 活锁 概念 活锁示例: 如何解决活锁呢? 饥饿 概念 如何解决饥饿呢? 死锁 概念 死锁:一组互相竞争资源的线 ...

  9. 线程死锁的成因?如何查找并定位死锁,解决死锁?这里教你几招~

    目录 什么是死锁? 死锁代码案例: 出现死锁的原因 教你如何定位死锁位置~ 死锁解决方法 什么是死锁? 死锁就是指线程t1要使用的资源被线程t2占用,线程t2想使用的资源被线程 t1占用,这就像两股绳 ...

  10. redis rua解决库存问题_【150期】面试官:Redis的各项功能解决了哪些问题?

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅 阶段汇总集 ...

最新文章

  1. ng new ng-pro 报错(创建angular6项目报错)
  2. Tensorflow— saver_restore
  3. 网络爬虫--SAX处理xml
  4. 汇编: loop指令
  5. 悠中选优,畅享马尔代夫与塞舌尔之旅
  6. oracle允许空行,oracle用户权限的一些基本操作
  7. AO3414相关技术资料
  8. wifi扫描流程图_扫描方法与流程
  9. GD32创建工程与启动文件选择
  10. 爱好-超级IP:超级IP
  11. pandas 保存Excel 解决科学计数法问题
  12. WinForm 去掉DataGridView最后一行的空白行,删除空白行
  13. 魔兽争霸官方平台支持Linux,首页-魔兽争霸官方对战平台
  14. Win10查看电脑上次的开机时间
  15. 游戏编程该读哪些书?
  16. *jqwidgets jqxgrid 使用心得 jqxgrid教程 jqxgrid+SpringMVC(初级) 集成JAVA SSM
  17. 2022做跨境为什么要首选Lazada和shopee,现在入驻会面临哪些挑战和机遇?
  18. echarts 立体柱状图(多个柱状图)
  19. 大数据面试之hive重点(二)
  20. GTC2019大会的部分总结

热门文章

  1. 如何第一时间了解研究领域最新动态?
  2. seaborn使用FacetGrid函数可视化山脊图(Ridgeline Plot with Seaborn)
  3. Python时间转换函数:时间转化为时间戳、时间戳转化为时间、当前日期、当前时间、星期几、前面或者后面多少天、年、月、日等
  4. R语言数据热力图绘制实战(基于原生R函数、ggplot2包、plotly包)
  5. plotly基于dataframe数据绘制股票K线图并过滤非交易时间
  6. cufflinks基于QuantFig绘制高级金融图
  7. 异常检测概念、异常检测的思路、孤立森林Isolation Forest、​​​​​​​局部异常因子LOF、OneClassSVM、EllipticEnvelop
  8. 通过构建DCA(Decision Curve Analysis)模型、获取模型数据并使用python进行绘图
  9. The Third Revolution in Sequencing Technology
  10. 一个学术 导航网站----科塔学术