Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
饥饿和活锁没有死锁常见,但仍然是每个并发软件设计者都可能遇到的问题。
Starvation 描述了一种情况:线程无法获得对共享资源的定期访问,无法继续执行。当“贪婪”线程使共享资源长时间不可用时,就会发生这种情况。例如,假设一个对象提供了一个通常需要很长时间才能返回的同步方法。如果一个线程经常调用这个方法,那么其他需要频繁同步访问同一对象的线程通常会被阻塞。
线程通常会响应另一个线程的操作。如果另一个线程的操作也是对另一个线程的操作的响应,则可能导致 livelock (活锁)。与死锁一样,活锁线程无法取得进一步进展。但是,线程没有被阻塞 它们只是忙于相互响应而无法继续工作。这相当于两个试图在走廊里互相通过的人:Alphonse 向左移动让 Gaston 通过,而 Gaston 向右移动让 Alphonse 通过。看到他们仍然互相阻挡,Alphone 向右移动,而 Gaston 向左移动。他们仍在互相阻挡,所以...