01-1 死锁(Deadlock)、饥饿(Starvation)、活锁(LiveLock)

        死锁、饥饿和活锁都属于多线程的活跃性问题。如果发生了上述几种情况,那么表示相关线程可能就不活跃了,也就是说它可能很难再继续往下执行了。

1、死锁

        死锁应该是最糟糕的一种情况了,比如两个人再吃饭,吃饭需要筷子和碗,假设现在都只有一个,A率先拿到了筷子,而B率先拿到了碗,此时A和B都再互相等待着对方手中的资源,没有的到资源之前,都一直处于等待的状态,此时就会造成两个人永远再互相等待,这是一件非常可怕的事情。

        死锁是一个很严重的并且应该避免和时时小心的问题。

2、饥饿

        饥饿是指某一个或者多个线程因为种种原因无法获取所需要的资源,导致一直无法执行。比如它的线程优先级可能太低,而高优先级的线程不断抢占它需要的资源,导致低优先级线程无法工作。

        在自然界中,母鸟给雏鸟喂食时很容易出现这种情况:由于雏鸟肯多,食物有限,雏鸟之间的食物竞争可能非常厉害,经常抢不到食物的雏鸟可能会被饿死。

        线程的饥饿非常类似这种情况。此外,某一个线程一直占着关键资源不放,导致其他需要这个资源的线程无法正常执行,这种情况也是饥饿的一种。

3、活锁

        活锁是一种非常有趣的情况。不知道大家是否遇到这么一种场景,当你要坐电梯下楼时,电梯到了,门开了,这是你正准备出去。但很不巧的是,门外一个人挡着你的去路,他像进来。于是,你很礼貌地靠左走,避让对方。同时,对方也非常礼貌地靠右走,避让你。结果,你们俩就撞上了。于是乎,你们都意识到了问题,希望尽快避让对方,不过介于人类的智能,我相信这个动作重复两三次后,你应该可以顺利解决这个问题。因为这个时候,大家都本能地对视,进行交流,保证这种情况不再发生。

        但如果这种情况发生在两个线程之间可能就不会那么幸运了。如果线程的智力不够,且都秉承着"谦让"的原则,主动将资源释放给他人使用,那么就是导致资源不断地在两个线程间跳动,而没有一个线程可以同时拿到所有资源正常执行。这种情况就是活锁。

        再举一个例子,如上述死锁例子所说,两个人都互相谦让着自己手中的资源,A将自己的筷子让给了B,B将自己的碗让给了A,此时他们一直互相谦让,而无法同时获取碗和筷子,这时就是典型的活锁现象。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值