位置: 编程技术 - 正文

java多线程死锁(java多线程产生死锁)

编辑:rootadmin

推荐整理分享java多线程死锁(java多线程产生死锁),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:java多线程死锁的原因及解决方法,java多线程死锁的原因及解决方法,java多线程假死,java多线程中的锁,Java多线程死锁代码,Java多线程死锁解决,Java多线程死锁解决,java多线程死锁的原因及解决方法,内容如对您有帮助,希望把文章链接给更多的朋友!

原文链接 作者:Jakob Jenkov 译者:申章 校对:丁一

java中死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序请求同一组锁的时候。

例如,如果线程1锁住了A,然后尝试对B进行加锁,同时线程2已经锁住了B,接着尝试对A进行加锁,这时死锁就发生了。线程1永远得不到B,线程2也永远得不到A,并且它们永远也不会知道发生了这样的事情。为了得到彼此的对象(A和B),它们将永远阻塞下去。这种情况就是一个死锁。

该情况如下:

Thread 1 locks A, waits for BThread 2 locks B, waits for A这里有一个TreeNode类的例子,它调用了不同实例的synchronized方法:public class TreeNode { TreeNode parent = null; List children = new ArrayList(); public synchronized void addChild(TreeNode child){ if(!this.children.contains(child)) { this.children.add(child); child.setParentOnly(this); } } public synchronized void addChildOnly(TreeNode child){ if(!this.children.contains(child){ this.children.add(child); } } public synchronized void setParent(TreeNode parent){ this.parent = parent; parent.addChildOnly(this); } public synchronized void setParentOnly(TreeNode parent){ this.parent = parent; }}如果线程1调用parent.addChild(child)方法的同时有另外一个线程2调用child.setParent(parent)方法,两个线程中的parent表示的是同一个对象,child亦然,此时就会发生死锁。下面的伪代码说明了这个过程:Thread 1: parent.addChild(child); //locks parent --> child.setParentOnly(parent);Thread 2: child.setParent(parent); //locks child --> parent.addChildOnly()

首先线程1调用parent.addChild(child)。因为addChild()是同步的,所以线程1会对parent对象加锁以不让其它线程访问该对象。

然后线程2调用child.setParent(parent)。因为setParent()是同步的,所以线程2会对child对象加锁以不让其它线程访问该对象。

java多线程死锁(java多线程产生死锁)

现在child和parent对象被两个不同的线程锁住了。接下来线程1尝试调用child.setParentOnly()方法,但是由于child对象现在被线程2锁住的,所以该调用会被阻塞。线程2也尝试调用parent.addChildOnly(),但是由于parent对象现在被线程1锁住,导致线程2也阻塞在该方法处。现在两个线程都被阻塞并等待着获取另外一个线程所持有的锁。

注意:像上文描述的,这两个线程需要同时调用parent.addChild(child)和child.setParent(parent)方法,并且是同一个parent对象和同一个child对象,才有可能发生死锁。上面的代码可能运行一段时间才会出现死锁。

这些线程需要同时获得锁。举个例子,如果线程1稍微领先线程2,然后成功地锁住了A和B两个对象,那么线程2就会在尝试对B加锁的时候被阻塞,这样死锁就不会发生。因为线程调度通常是不可预测的,因此没有一个办法可以准确预测什么时候死锁会发生,仅仅是可能会发生。

更复杂的死锁

死锁可能不止包含2个线程,这让检测死锁变得更加困难。下面是4个线程发生死锁的例子:

<pre style="border: 1px solid rgb(, , ); padding: px px; margin-bottom: 1em; line-height: px; overflow: auto; border-radius: 5px; color: rgb(, , ); widows: auto; background-color: rgb(, , );">Thread 1 locks A, waits for BThread 2 locks B, waits for CThread 3 locks C, waits for DThread 4 locks D, waits for A</pre>

线程1等待线程2,线程2等待线程3,线程3等待线程4,线程4等待线程1。

数据库的死锁

更加复杂的死锁场景发生在数据库事务中。一个数据库事务可能由多条SQL更新请求组成。当在一个事务中更新一条记录,这条记录就会被锁住避免其他事务的更新请求,直到第一个事务结束。同一个事务中每一个更新请求都可能会锁住一些记录。

当多个事务同时需要对一些相同的记录做更新操作时,就很有可能发生死锁,例如:

Transaction 1, request 1, locks record 1 for updateTransaction 2, request 1, locks record 2 for updateTransaction 1, request 2, tries to lock record 2 for update.Transaction 2, request 2, tries to lock record 1 for update.

因为锁发生在不同的请求中,并且对于一个事务来说不可能提前知道所有它需要的锁,因此很难检测和避免数据库事务中的死锁。

android studio ndk编程 配置 参考:

cocos2dx-3.2+lua 常用函数 --常用函数setVisible(false)setTouchEnabled(true)setScale(0.7)--设置缩放比例setRotation()--设置开始角度setTag(i)setAnchorPoint(0,0)getContentSize()--获取部件大小setLocalZOrder(-

Android: AudioFlinger中AudioPolicy的简单介绍 1,AudioFlinger的类图2,AudioPolicy相关的序列图

标签: java多线程产生死锁

本文链接地址:https://www.jiuchutong.com/biancheng/378153.html 转载请保留说明!

上一篇:魅族-魅蓝note无法链接adb解决办法(魅蓝notezol)

下一篇:android studio ndk编程 配置

  • 金税盘年费能全额抵扣吗
  • 研发人员差旅费可以资本化吗
  • 交易性金融资产的交易费用计入哪里
  • 会计科目累计摊销是什么意思
  • 年终奖可以不计入年总收入吗
  • 出租车发票可以重新打印吗
  • 小规模什么情况下只交城建税
  • 非主营业务收入计入什么科目
  • 自产的产品
  • 邮政能否为固定业户代开增值税普通发票
  • 小规模纳税人转让土地使用权
  • 职工集资建房款属公款吗
  • 房屋契税是按照发票上的不含税价格交吗
  • 境外劳务输出有哪些类型
  • 银行代扣水费发票怎么开
  • 事业单位财政授权书模板
  • 个人独资企业法人承担什么责任
  • 社会团体政策
  • 已缴契税是否可以在土地增值税扣除?
  • 代建项目增值税税率
  • 非居民企业能否认定为一般纳税人
  • 不动产经营租赁属于现代服务吗
  • 公司给个人买的意外险个人有权利查吗
  • 个税申报状态失败
  • 企业收到党建经费 所得税
  • 服务类的公司有哪些
  • 收到工程款退回的账务处理
  • 非税收入的发票能抵扣吗
  • 稽查查补的税款可以享受即征即退吗
  • 开票金额与收入金额有差额可以吗
  • 个人银行卡转公账怎么转
  • 投资公司抛售原始股如何交税?
  • 电脑看电影开全屏画面会迟钝是什么原因
  • 完成交易预付账怎么做账
  • 企业帐薄包括哪些
  • 申请出具商标注意事项
  • win11怎么打开磁盘管理
  • 没有了睡眠功能
  • 企业自行搬迁需要交税吗
  • 跨年租赁费如何处理
  • 受托方代扣代缴的消费税计入什么科目
  • 以前年度损益在报表哪里体现
  • 预缴土地增值税的税率
  • sql数据库语句基本语法
  • 借管理费用贷应交税费个人所得税
  • 基于php判断客户是否存在
  • 汽车抵押贷款会上征信吗
  • 供应商退回货款怎么入账
  • 以个人名义和公司名义入股的利弊
  • 应纳税所得额中国债利息收入
  • php安装不上
  • 企业收到土地补偿金需要开发票吗
  • sql cell函数
  • 出口退税是什么
  • 建筑业挂靠企业所得税如何收取?
  • 财务费用明细账图片
  • 原材料采购未入库会计分录
  • 先付一部分款发票怎么做
  • 城镇土地税需要计税吗
  • 广州残保金如何计算
  • 预支款怎么做现金账
  • mysql第二章
  • Vista和Server08 SP2 RTM-Escrow发放给测试者
  • Win7怎么把桌面文件迁移到D盘中
  • ubuntu搭建tftp服务器
  • linux vps 教程
  • CentOS系统中与时间的相关命令详解
  • linux命令telnet
  • win10如何删除右键菜单选项
  • windows7旗舰版怎么打字
  • 边做游戏边学
  • JSONLINT:python的json数据验证库实例解析
  • python中requests小技巧
  • 利用python绘图
  • Javascript Global对象
  • jQuery插件封装时如要实现链式编程,需要
  • 详解16型人格
  • 浅谈如何实现乡村振兴论文
  • 委托人全权代理
  • 房产增值税和土地增值税的区别案例
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设