死锁产生的条件及解决办法

死锁产生的条件及解决办法


前言

多线程编程中死锁是必须要了解的情况下面来看看产生的条件及解决办法


一、死锁产生的因素?

只要发生死锁,下面的因素必定会产生。

1 、互斥

例如 synchronized,就是互斥条件的锁。

2、占有并等待

例如线程1锁住了A,要抢占B等待B资源,这时候线程1就可以说是处于占有并等待的状态。

3、不可抢占

例如线程1锁住了A,然后要抢占B,这个时候B是不能强行抢占过来的,线程1就是不可抢占的状态。

4、循环等待

例如线程1锁住了A,要抢占B,线程2锁住了B要抢占A,这时候两个线程就处于循环等待的状态。

二、解决方案

  1. 针对第一个因素,可以使用原子类,例如AtomicInteger这种类型的线程安全类去计算或者其他方式绕开互斥即可。
  2. 针对第二个因素,我们可以直接获取2个资源再锁,把A、B放到一个资源类中,同时获取到了两个资源才算锁住了资源。把锁的范围扩大。
  3. 针对第三个因素,我们可以设置超时时间,例如ReentrantLock中设置超时时间,超时了就不再等待。
  4. 针对第四个因素,可以按顺序获取锁,无论是线程1还是线程2,都要先获取A的锁,然后获取B的锁,再去执行业务代码。这样就能解除死锁。

总结

以上就是对于死锁的产生原因及解决方案,不对的欢迎指出,共同进步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值