Livelock
При livelock потоки не заблокированы: они активно меняют состояние в ответ друг на друга, но полезная работа не продвигается.
Пример — два участника одновременно уступают дорогу:
A видит B → отступает влево
B видит A → отступает вправо
A снова видит B → отступает вправо
B снова видит A → отступает влево
... оба активны, прохода нетТак бывает при одинаковой политике немедленного retry:
while (!tryAcquireBoth()) {
releaseEverything();
// оба потока синхронно повторяют тот же маневр
}Исправления:
- случайный или экспоненциальный backoff;
- ограниченное число попыток и явная ошибка;
- детерминированный приоритет/порядок;
- координатор или очередь вместо взаимных уступок.
| Проблема | Состояние потоков | Движение системы |
|---|---|---|
| deadlock | ждут ресурсы | нет |
| livelock | активно выполняются | нет полезного |
| starvation | некоторые работают | один участник не продвигается |
На собеседовании
- Чем livelock отличается от deadlock? Потоки активны, но без прогресса.
- Почему простой retry опасен? Участники могут повторять синхронный конфликт.
- Что дает jitter? Разводит повторные попытки во времени.
- Можно ли увидеть livelock как высокий CPU? Часто да, но это симптом, не доказательство.