Livelock

При livelock потоки не заблокированы: они активно меняют состояние в ответ друг на друга, но полезная работа не продвигается.

Пример — два участника одновременно уступают дорогу:

A видит B → отступает влево
B видит A → отступает вправо
A снова видит B → отступает вправо
B снова видит A → отступает влево
... оба активны, прохода нет

Так бывает при одинаковой политике немедленного retry:

while (!tryAcquireBoth()) {
    releaseEverything();
    // оба потока синхронно повторяют тот же маневр
}

Исправления:

  • случайный или экспоненциальный backoff;
  • ограниченное число попыток и явная ошибка;
  • детерминированный приоритет/порядок;
  • координатор или очередь вместо взаимных уступок.
ПроблемаСостояние потоковДвижение системы
deadlockждут ресурсынет
livelockактивно выполняютсянет полезного
starvationнекоторые работаютодин участник не продвигается

На собеседовании

  • Чем livelock отличается от deadlock? Потоки активны, но без прогресса.
  • Почему простой retry опасен? Участники могут повторять синхронный конфликт.
  • Что дает jitter? Разводит повторные попытки во времени.
  • Можно ли увидеть livelock как высокий CPU? Часто да, но это симптом, не доказательство.