生活生产服务其它并发编程

如何避免线程死锁?

如何避免线程死锁呢?有什么方法吗?

参与22

4同行回答

nkj827nkj827项目经理长春长信华天
在有些情况下死锁是可以避免的。三种用于避免死锁的技术:加锁顺序(线程按照一定的顺序加锁)加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)死锁检测...显示全部

在有些情况下死锁是可以避免的。三种用于避免死锁的技术:

  1. 加锁顺序(线程按照一定的顺序加锁)
  2. 加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
  3. 死锁检测
收起
系统集成 · 2020-04-30
浏览872
zhuqibszhuqibs软件开发工程师Adidas
现在,面试官来到最后一部分,也是最重要的问题之一,在我看来:你如何修复代码中的死锁?如果您仔细查看了上面的代码,那么您可能已经发现死锁的真正原因不是多线程,而是它们请求锁定的方式。 如果您提供有序访问,则问题将得到解决。现在,不存在任何死锁,因为两个方法都以相同的顺序访...显示全部

现在,面试官来到最后一部分,也是最重要的问题之一,在我看来:你如何修复代码中的死锁?如果您仔细查看了上面的代码,那么您可能已经发现死锁的真正原因不是多线程,而是它们请求锁定的方式。 如果您提供有序访问,则问题将得到解决。

现在,不存在任何死锁,因为两个方法都以相同的顺序访问Integer和String类文本的锁。 因此,如果线程A获取Integer对象的锁定,则线程B将不会继续,直到线程A释放整数锁定;即使线程B持有字符串锁,也不会阻塞线程A,因为现在,线程B不会期望线程A释放整数锁以继续进行。

收起
互联网服务 · 2020-04-30
浏览859
youki2008youki2008系统架构师DDT
我们只要破坏产生死锁的四个条件中的其中一个就可以了。破坏互斥条件这个条件我们没有办法破坏,因为我们用锁本来就是想让他们互斥的(临界资源需要互斥访问)。破坏请求与保持条件一次性申请所有的资源。破坏不剥夺条件占用部分资源的线程进一步申请其他资源时,如果申请不到,可...显示全部

我们只要破坏产生死锁的四个条件中的其中一个就可以了。

破坏互斥条件
这个条件我们没有办法破坏,因为我们用锁本来就是想让他们互斥的(临界资源需要互斥访问)。

破坏请求与保持条件
一次性申请所有的资源。

破坏不剥夺条件
占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。

破坏循环等待条件
靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。

收起
互联网服务 · 2020-04-30
浏览856
zftangzftang其它小白一枚
数据库如果监测到了一组事物发生了死锁时,将选择一个牺牲者并放弃这个事物。Java虚拟机解决死锁问题方面并没有数据库这么强大,当一组Java线程发生死锁时,这两个线程就永远不能再使用了,并且由于两个线程分别持有了两个锁,那么这两段同步代码/代码块也无法再运行了----除非终...显示全部

数据库如果监测到了一组事物发生了死锁时,将选择一个牺牲者并放弃这个事物。Java虚拟机解决死锁问题方面并没有数据库这么强大,当一组Java线程发生死锁时,这两个线程就永远不能再使用了,并且由于两个线程分别持有了两个锁,那么这两段同步代码/代码块也无法再运行了----除非终止并重启应用。

收起
互联网服务 · 2020-04-30
浏览832

提问者

wfang_2020
测试工程师DSL
擅长领域: 系统运维云计算容器

相关问题

问题状态

  • 发布时间:2020-04-30
  • 关注会员:5 人
  • 问题浏览:1733
  • 最近回答:2020-04-30
  • X社区推广