# 饥饿和活锁

> 原文： [https://docs.oracle.com/javase/tutorial/essential/concurrency/starvelive.html](https://docs.oracle.com/javase/tutorial/essential/concurrency/starvelive.html)

饥饿和活锁是一个问题，而不是死锁，但仍然是每个并发软件设计者都可能遇到的问题。

## 饥饿

_Starvation_ 描述了线程无法获得对共享资源的定期访问而无法取得进展的情况。当“贪婪”线程使共享资源长时间不可用时，就会发生这种情况。例如，假设一个对象提供了一个通常需要很长时间才能返回的同步方法。如果一个线程经常调用此方法，则通常还需要阻止对同一对象进行频繁同步访问的其他线程。

## 活锁

线程通常用于响应另一个线程的操作。如果另一个线程的动作也是对另一个线程的动作的响应，则可能导致 _ 活锁 _。与死锁一样，活锁线程无法取得进一步进展。但是，线程没有被阻塞 - 他们只是太忙于相互回应以恢复工作。这相当于两个试图在走廊里互相通过的人：Alphonse 向左移动让 Gaston 通过，而 Gaston 向右移动让 Alphonse 通过。看到他们仍然互相阻挡，Alphone 向右移动，而 Gaston 向左移动。他们还在互相阻挡，所以......