liveness 生存性/活性

翻译了两篇,这篇就不翻译了,自己写吧。


对于线程来说除了安全性,我们还应该重视它的生存性(我觉得翻译成三个字说着比较顺)。 为了保证线程安全,我们往往需要用到同步,但是同步限制了线程的执行,线程必须为了获得共享资源而等待。等待的时间可长可短,这就体现了线程的活跃程度,如果线程只是安全的执行了,而执行的很慢,那并发也就显得不是很必要了。所以除了保证线程的安全以外我们还必须保证线程的活跃。


同步带来了阻塞的问题,阻塞就得等待,前面提到等待的时间可长可短,最坏的情况下还可能:

死锁(deadlock)

所谓死锁就是一组线程被互相阻塞,在互相等待对方释放资源,经典的就是哲学家就餐问题,每个哲学家都吃不到饭。

死锁发生的条件有:

1) 具有多个共享资源(被共享的对象)

2) 同一个线程锁定一个资源后,在没有解锁前想要尝试锁定另外一个资源

3) 获得共享资源的顺序不固定,资源之间没有优先级

避免以上三个条件中的任何一个都可以避免死锁。


也有可能发生饥饿(starvation)和活锁(livelock)

饥饿指线程一直在等待自己想要的资源而得不到,被block很长的时间。造成这种情况的原因可能是其他线程一直在使用这个资源,永远轮不到这个可怜的线程。狼群就餐有等级制度,假设捕获的食物不够,每次吃饭的时候那个等级最低的狼都吃不到东西,那这个可怜的狼就只有饿死了。(或许实际情况不是这样,取个例子,比较好记)


活锁,这种情况下没有阻塞,线程都是活跃的,都在执行,但是都在原地踏步,最好的例子就是两个人过过道的例子。A和B分别从过道的两头走过来,A给B让路的时候B也就A让路,如此反复,双方都在一直让路。线程没有人那么聪明,所以他们可能会一直让下去,于是就发生了活锁这种事情。

你可能感兴趣的:(liveness 生存性/活性)