产生死锁的原因:

1. 系统资源不足、分配不当。系统中都会有一种不可剥夺的资源,若是这些资源不能够满足进程运行的需要,那么就只能进行资源争夺,从而陷入死锁。

注意:只有对不可剥夺资源的竞争才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。

2. 进程运行推进的顺序不合理。进程运行过程中,请求和释放资源的顺序不当,也可能产生死锁。

以两个线程为例,第一个线程A锁住了一个资源1,另一个线程B也同时锁住了另一个资源2,这时,第一个线程A经过一段时间操作,需要资源2来继续执行,但是资源2被线程B锁定,不能为线程A所用。同样,线程B经过一段时间操作,需要资源1来继续执行,但是资源1被线程A锁定,不能为线程B所用。这样就形成了资源互锁,出现了死锁状态。

死锁解决方法:

1.线程按照一定的顺序加锁,避免嵌套封锁。当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生。如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生。如果你已经有一个资源了就要避免封锁另一个资源。如果你运行时只有一个对象封锁,那是几乎不可能出现一个死锁局面的。

2. 加锁时限,避免无限期等待。既然死锁的产生是两个线程无限等待对方持有的锁,那么只要等待时间有个上限不就好了。尝试获取锁的时候加一个超时时间,这也就意味着在尝试获取锁的过程中若超过了这个时限该线程则放弃对该锁请求。若一个线程没有在给定的时限内成功获得所有需要的锁,则会进行回退并释放所有已经获得的锁,然后等待一段随机的时间再重试。这段随机的等待时间让其它线程有机会尝试获取相同的这些锁,并且让该应用在没有获得锁的时候可以继续运行。

3. 死锁检测,死锁检测是一个更好的死锁预防机制,它主要是针对那些不可能实现按序加锁并且锁超时也不可行的场景。每当一个线程获得了锁,会在线程和锁相关的数据结构中将其记下。除此之外,每当有线程请求锁,也需要记录在这个数据结构中。当一个线程请求锁失败时,这个线程可以遍历锁的关系图看看是否有死锁发生。

java解决线程死锁_为你解决Java线程死锁相关推荐

  1. call线程起名字_高级分享:Java多线程你真的理解透彻了吗?带你玩转一次多线程!...

    不知道怎么引入正文 相信后端同学在开发的时候多多少少都会涉及到多线程开发,作为Java开发的我也同样会经常用到多线程开发. 我认为Java语言在处理多线程上是非常优秀的,我们可以使用简明的代码实现线程 ...

  2. java线程堆栈_深入JVM剖析Java的线程堆栈

    在这篇文章里我将教会你如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题的根因.在我看来线程堆栈分析技术是Java EE产品支持工程师所必须掌握的一门技术.在线程堆栈中存储的信息,通常远超出你的想象 ...

  3. springboot tomcat默认线程数_记一次JAVA线程池的错误用法

    最近项目一个项目要结项了,但客户要求 TPS 能达到上千,而用我写的代码再怎么弄成只能达到 30 + 的 TPS,然后我又将代码中能缓存的都缓存了,能拆分的也都拆分了,拆分时用的线程池来实现的:其实现 ...

  4. java主线程和子线程区别_主线程异常– Java

    java主线程和子线程区别 Being a Java Programmer, you must have seen exception in thread main sometimes while r ...

  5. mongodb线程池_常用高并发网络线程模型设计及MongoDB线程模型优化实践

    服务端通常需要支持高并发业务访问,如何设计优秀的服务端网络IO工作线程/进程模型对业务的高并发访问需求起着至关重要的核心作用. 本文总结了了不同场景下的多种网络IO线程/进程模型,并给出了各种模型的优 ...

  6. std string与线程安全_详解linux系统中断线程的那些事

    很多情况下,使用信号来终止一个长时间运行的线程是合理的.这种线程的存在,可能是因为工作线程所在的线程池被销毁,或是用户显式的取消了这个任务,亦或其他各种原因.不管是什么原因,原理都一样:需要使用信号来 ...

  7. java跟python对比_【多年的Java程序员总结Java与Python的对比 】

    多年的Java程序员总结Java与Python的对比 作为一个有多年职场经验的技术员,每当我遇到同行时,我都会问一句"你现在用的是什么语言?你喜欢用哪种语言?"至于答案,容后再说. ...

  8. concurrenthashmap为什么是线程安全_为什么SimpleDateFormat不是线程安全的?

    点击上方小伟后端笔记关注公众号 每天阅读Java干货文章 一.前言 日期的转换与格式化在项目中应该是比较常用的了,最近同事小刚出去面试实在是没想到被 SimpleDateFormat 给摆了一道... ...

  9. java list e 查找_源码(04) -- java.util.ListE

    java.util.List 源码分析(JDK1.7) ------------------------------------------------------------------------ ...

最新文章

  1. 数值比较器实现_伺服操作器FBQA7000销售-老友网
  2. 网络回溯分析技术八大应用之运维评估 网络运维的真正价值
  3. 如何将四个一字节的数转换为一个四字节数
  4. 启动多线程的两种情况比较
  5. jquery中siblings方法配合什么方法一起使用
  6. python webviewer爬虫_爬虫再也不怕检测浏览器环境了
  7. java提取文章摘要内容
  8. 项目是采用目前比较流行的 SpringBoot/SpringCloudAlibaba构建新零售微服务电商项目
  9. 读写自旋锁,第1部分(来自IBM)
  10. ActiveMQ学习总结(9)——Linux中安装ActiveMQ
  11. school_vue操作记录
  12. HDOJ 3507 Print Article(DP + 斜率优化)
  13. arcmap 10.2 shp合并
  14. PS教程:逼真的模特投影
  15. StringBuffer去掉最后一个字符
  16. [Java][详解]使用jintellitype实现键盘全局监听
  17. 单片机开发无线控制系列-单片机端代码实现
  18. 关于务实思维的务实思考
  19. markdown图片旋转
  20. 电子显示Display基础知识

热门文章

  1. autojs 多线程 暂停
  2. 计算机音乐羊,知识|羊对音乐做了哪些贡献
  3. HTML页面多个平行四边形,用css3旋转写平行四边形
  4. Hi5 2.0开发——基于HTC VIVE 凝视的场景切换
  5. 鸡和兔关在一个笼子里,鸡有2只脚,兔有4只脚,没有例外。已知现在可以看到笼子里m个头和n只脚,求鸡和兔子各有多少只?
  6. Android的高级控件(自动提示文本框与下拉列表)
  7. 小红书探店文案应该怎么写?探店文案好写吗
  8. suspendlayout,resumelayout,layout,performlayout【转】
  9. JXL解决excl中的日期无法筛选问题
  10. 递归算法实例:十进制转换N进制(vb.net代码)