饥饿与活锁

与死锁相比,饥饿和活锁的问题要少得多,但仍然是每个并行软件设计人员都可能遇到的问题。

Starvation

饥饿描述了一种情况,即线程无法获得对共享资源的常规访问并且无法取得进展。当“贪婪”线程使共享资源 Long 时间不可用时,就会发生这种情况。例如,假设一个对象提供了一个同步方法,该方法通常需要很 Long 时间才能返回。如果一个线程频繁调用此方法,则也需要频繁同步访问同一对象的其他线程将经常被阻塞。

Livelock

一个线程通常响应另一个线程的操作而行动。如果另一个线程的动作也是对另一个线程的动作的响应,则可能会导致活锁。与死锁一样,活锁的线程无法取得进一步的进展。但是,线程没有被阻塞-它们只是忙于彼此响应而无法 continue 工作。这可比作两个人试图在走廊中互相通过的场景:阿方斯(Alphonse)向左移动以让加斯顿(Gaston)通过,而格斯敦(Gaston)向右移动以让 Alphonse 通过。看到他们仍然互相阻挡,Alphone 向右移动,而 Gaston 向左移动。他们仍然互相阻碍,所以...