用生活举例看Java多线程活跃性问题【死锁、饥饿、活锁】

死锁:吃饭问题,5个人每人只有一双筷子,只有让另外一个人分享他自己的筷子给自己,自己才能吃到饭。若存在这样的情况,若每个人都不把自己的筷子借给别人用餐,每个人都抓着自己手中的筷子不放,那么每个人都吃不上饭饿死了。也就是说A线程拥有B线程所需的资源,B线程也有A线程所需资源,但两者都不把资源分享出来,最后需求达不到,最后饿死。

 

饥饿问题:学校饭堂排队打饭,但有些人无秩序插队,那么插队的人拥有了更高的优先级,更可能打到饭吃,也可能他买上了饭也不离开,导致后面的人无法打饭。最后那些守规矩的人(优先级很低的人),就被饿死了。

 

引起饥饿问题的一些因素:

  1. 高优先级吞噬所有低优先级的CPU时间片
  2. 线程被永久堵塞在一个等待进入同步块的状态
  3. 等待的线程永远不被唤醒来

如果尽量避免饥饿问题:

设置合理的优先级,使用锁来代替synchronized

 

活锁:到达终点有两条路(记作1号路和2号路),有一对冤家A和B两人同时走了1号路,在途中相遇,他们俩看见了对方,于是都转身离开,A走了2号路,B也走了2号路,在行走的过程中,两人又再见碰面,于是又转身离开。后来A、B两人又同时走了1号路又再次碰面,就这样反反复复...这就是活锁问题
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值