学习:笔记— 什么死锁和活锁?如何解决

学海无涯

死锁:

产生死锁的必备条件:

1.互斥条件

2.请求保持

3.不剥夺

4.环路等待

用自己理解来解释:

1.多个线程同时去那多把锁,并且,锁的数量小于等于线程数量

2.多个线程去拿锁的顺序是互斥的

3.拿到锁后,不释放

如何解决死锁?

从产生死锁的必备条件着手,方法一:让线程间拿锁的顺序由互斥改成一致,这样,CPU在分配时间片时,就不会产生死锁

                                               方法二:尝试去拿锁,如果拿不到就释放已拿到的锁,使用 ReentrantLock,尝试去拿锁

    public boolean tryLock() {
        return sync.nonfairTryAcquire(1);
    }

    public boolean tryLock(long timeout, TimeUnit unit)
            throws InterruptedException {
        return sync.tryAcquireNanos(1, unit.toNanos(timeout));
    }

拿不到锁就去释放已拿到的锁

    public void unlock() {
        sync.release(1);
    }

 

那么对于方法二,不做特别处理,会产生什么情况?会发生活锁。

在循环去拿锁,拿不到,释放已拿到锁的时候,在CPU分配时间片的时候,会频繁的去拿锁,释放锁,所以在释放的锁的时候,沉睡一段随机时间数,让两个线程间在第二次以后,去拿锁的时候,错开。

死锁和活锁的区别?

死锁是多个线程间,互相等待对方释放锁,线程进入等待状态,不进行任何操作,线程无法进入运行状态。

活锁时多个线程在一直运行,一直在重复进行尝试拿锁,拿不到,释放锁,直到拿到锁,执行业务,一直在运行中。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值