Вопрос проверяет умение различать разные виды проблем конкурентного выполнения.
При deadlock потоки полностью остановлены и ничего не делают. При livelock потоки продолжают работать, но не продвигаются к результату. Они постоянно реагируют друг на друга. CPU при этом может активно использоваться. С точки зрения результата система так же бесполезна.
Deadlock и livelock внешне похожи, но принципиально различаются по поведению потоков.
При deadlock:
потоки заблокированы
они ждут освобождения ресурсов
CPU практически не используется
состояние стабильно и неизменно
При livelock:
потоки активно выполняются
они постоянно меняют свое состояние
каждый поток «уступает» другому
полезная работа не выполняется
Пример логики:
поток A видит, что ресурс занят, и отступает
поток B делает то же самое
ситуация повторяется бесконечно
Livelock:
нагружает CPU
сложен для диагностики
выглядит как «работающая» система
Подходы:
добавление случайных задержек
ограничение количества повторных попыток
изменение стратегии синхронизации
Вывод: deadlock — это остановка, livelock — бесконечная бесполезная активность.