java中的死锁

什么是死锁?

        当线程 A 持有独占锁 a,并尝试去获取独占锁 b 的同时,线程 B 持有独占锁 b,并尝试获取独占锁 a 的情况下,就会发生 AB 两个线程由于互相持有对方需 要的锁,而发生的阻塞现象,我们称为死锁。

产生死锁的条件是什么?

        1、互斥条件:所谓互斥就是进程在某一时间内独占资源。

        2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不 放。

        3、不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。

        4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要 上述条件之 一不满足,就不会发生死锁。 理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、 预防和 解除死锁。

防止死锁可以采用以下的方法:

        尽量使用 tryLock(long timeout, TimeUnit unit)的方法 (ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以 退出防止死锁。

        尽量使用 Java. util. concurrent 并发类代替自己手写锁。

        尽量降低锁的使用粒度,尽量不要几个功能用同一把锁。

        尽量减少同步的代码块。

死锁与活锁的区别,死锁与饥饿的区别?

        死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成 的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

        活锁:任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝 试,失败,尝试,失败。 活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,这就是所谓的 “活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。

        饥饿:一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执 行的状态。

Java 中导致饥饿的原因:

        1、高优先级线程吞噬所有的低优先级线程的 CPU 时间。

        2、线程被永久堵塞在一个等待进入同步块的状态,因为其他线程总是能在它之 前持续地对该同步块进行访问。

        3、线程在等待一个本身也处于永久等待完成的对象(比如调用这个对象的 wait 方法),因为其他线程总是被持续地获得唤醒。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值