前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >死锁与活锁的区别,死锁与饥饿的区别

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

作者头像
鳄鱼儿
发布2024-05-21 16:24:24
560
发布2024-05-21 16:24:24
举报

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

死锁

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

  • 产生死锁的必要条件:
    • 互斥:所谓互斥就是线程在某一时间内独占资源。
    • 请求与保持:一个线程因请求资源而阻塞时,对已获得的资源保持不放。
    • 不剥夺:线程已获得资源, 在末使用完之前, 不能强行剥夺。
    • 循环等待:若干线程之间形成一种头尾相接的循环等待资源关系。

活锁

活锁:任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。

  • 活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“ 活”, 而处于死锁的实体表现为等待;
  • 活锁有可能自行解开,死锁则不能。

活锁一般是由于对死锁的不正确处理引起的。由于处于死锁中的多个线程同时采取了行动。 而避免的方法也是只让一个线程释放资源。

饥饿

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

  • Java 中导致饥饿的原因:
    • 高优先级线程吞噬所有的低优先级线程的CPU时间。
    • 线程被永久堵塞在一个等待进入同步块的状态,因为其他线程总是能在它之前持续地对该同步块进行访问。
    • 线程在等待一个本身也处于永久等待完成的对象(比如调用这个对象的wait方法),因为其他线程总是被持续地获得唤醒。

避免饥饿就应该是采用队列的方式,保证每个人都有机会获得请求的资源。 当然实现方式可以很多个变化,比如优先级,时间片等,都是“队列”的特殊形式保证每个人都有机会获得请求的资源。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 死锁与活锁的区别,死锁与饥饿的区别
    • 死锁
      • 活锁
        • 饥饿
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档