Ответ
Livelock — это ситуация, когда потоки взаимно блокируют друг друга, но не полностью, а продолжают выполнять бесполезную работу, реагируя на действия друг друга. В отличие от deadlock, потоки не заблокированы, но не могут прогрессировать.
Пример:
class Spoon {
private Diner owner;
public Spoon(Diner d) { owner = d; }
public synchronized void use() { System.out.println(owner.name + " is eating"); }
}
class Diner {
String name;
boolean isHungry = true;
public Diner(String n) { name = n; }
public void eatWith(Spoon spoon, Diner spouse) {
while (isHungry) {
if (spoon.owner != this) {
Thread.yield(); // Пытается уступить ложку
continue;
}
if (spouse.isHungry) {
spoon.owner = spouse; // Отдает ложку другому
continue;
}
spoon.use();
isHungry = false;
spoon.owner = spouse;
}
}
}
Здесь два потока (Diner) будут бесконечно передавать ложку друг другу, если оба голодны.