翻译了两篇,这篇就不翻译了,自己写吧。
对于线程来说除了安全性,我们还应该重视它的生存性(我认为翻译成三个字说着比較顺)。 为了保证线程安全,我们往往须要用到同步,可是同步限制了线程的运行,线程必须为了获得共享资源而等待。等待的时间可长可短,这就体现了线程的活跃程度,假设线程仅仅是安全的运行了,而运行的非常慢,那并发也就显得不是非常必要了。所以除了保证线程的安全以外我们还必须保证线程的活跃。
同步带来了堵塞的问题,堵塞就得等待,前面提到等待的时间可长可短,最坏的情况下还可能:
死锁(deadlock)
所谓死锁就是一组线程被互相堵塞,在互相等待对方释放资源,经典的就是哲学家就餐问题,每一个哲学家都吃不到饭。
死锁发生的条件有:
1) 具有多个共享资源(被共享的对象)
2) 同一个线程锁定一个资源后,在没有解锁前想要尝试锁定另外一个资源
3) 获得共享资源的顺序不固定,资源之间没有优先级
避免以上三个条件中的不论什么一个都能够避免死锁。
也有可能发生饥饿(starvation)和活锁(livelock)
饥饿指线程一直在等待自己想要的资源而得不到,被block非常长的时间。造成这样的情况的原因可能是其它线程一直在使用这个资源,永远轮不到这个可怜的线程。狼群就餐有等级制度,如果捕获的食物不够,每次吃饭的时候那个等级最低的狼都吃不到东西,那这个可怜的狼就仅仅有饿死了。(也许实际情况不是这样,取个样例,比較好记)
活锁,这样的情况下没有堵塞,线程都是活跃的,都在运行,可是都在原地踏步,最好的样例就是两个人过过道的样例。A和B分别从过道的两头走过来,A给B让路的时候B也就A让路,如此重复,两方都在一直让路。线程没有人那么聪明,所以他们可能会一直让下去,于是就发生了活锁这样的事情。