Что такое Livelock в Java

«Что такое Livelock в Java» — вопрос из категории Многопоточность, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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) будут бесконечно передавать ложку друг другу, если оба голодны.