当前位置: 首页 > article >正文

Java多线程中的死锁问题

1.什么是死锁

线程在获取资源的时候,由于获取不到,导致线程卡死(阻塞),程序就不执行了。

2.发生死锁的情况

1.一个线程获取一把锁

一个线程如果同时获取一把锁两次,如果是可重入锁,就没有问题

如果是不可重入锁就会发生死锁问题

2.两个线程获取两把锁

线程A在等待线程B,线程B在等待线程A,循环等待造成死锁问题

线程0获取到了锁1,线程1获取到了锁2,线程0等待锁2,线程1等待锁1,相互等待,无法释放造成了死锁。

3.多个线程获取多把锁

线程A等待线程B释放锁,线程B等待线程C释放锁,线程C等待线程A释放锁

3.造成死锁的原因

1.互斥访问:线程1拿到了锁1,线程2就不能同时得到该锁(互斥锁)

2.不可抢占:获取到锁的线程,除非自己主动释放锁,别的线程不能从它手里抢过来

3.保持与请求:线程1已经获取到了锁A,还要在这个基础上去获取锁B

4.循环等待:线程1等待线程2获取锁,线程2等待线程3获取锁,线程3等待线程1获取锁……

以上四条是造成死锁的必要条件,也就是说只要打破一条,死锁就不会形成。

4.分析如何解决死锁问题

1.互斥访问:锁的基本特性,不能打破。

2.不可抢占:锁的基本特性不能打破。

3.保持与请求:与代码的设计和实现相关,是可以打破的,只要规定一下获取锁的顺序。

4.循环等待:也可以打破,从设计的角度去合理的获取锁。


http://www.kler.cn/a/561785.html

相关文章:

  • Docker 部署 Jenkins持续集成(CI)工具
  • Java23种设计模式案例
  • smolagents学习笔记系列(五)Tools-in-depth-guide
  • 804 唯一摩斯密码词
  • 【leetcode hot 100 1】两数之和
  • 钉钉合同审批对接腾讯电子签,实现合同全流程自动化管理
  • 【删边问题——Tarjan求割边】
  • 宿主机的 root 是否等于 Docker 容器的 root?
  • Ajax数据采集与分析详解
  • 开源分布式存储系统在云原生数据库领域的实践与应用
  • 自定义提交按钮触发avue-form绑定的submit事件
  • AI前端开发:ScriptEcho如何降低编程培训学习成本
  • python绑定udp时使用127.0.0.1作为ip,无法sendto,报错Invalid argument
  • 无限宽度神经网络的神经正切核(Neural Tangent Kernel, NTK)
  • 多线程进阶 : 八股文面试题 一 [Java EE 多线程 锁和死锁相关问题]
  • vscode设置自动换行
  • 【WordPress】发布文章时自动通过机器人推送到钉钉
  • Pi币今日成交价格飙升,XBIT去中心化交易所助力新浪潮
  • MySQL知识
  • vue3.0将后端返回的word文件流转换为pdf并导出+html2pdf.js将页面导出为pdf