🔴 Сложный · 3 очк. Горутины и конкурентность
Что такое livelock и чем он отличается от deadlock?
A Livelock и deadlock - это одно и то же
B При deadlock горутины заблокированы и ждут; при livelock горутины активны, но бесконечно реагируют друг на друга без продвижения к результату
C Livelock возникает только в однопоточных программах
D Livelock - это ошибка компилятора
Объяснение вопроса

Deadlock - горутины навсегда заблокированы, каждая ждет ресурс, удерживаемый другой. Программа зависает, CPU не потребляется.

Livelock - горутины активны и потребляют CPU, но бесконечно реагируют друг на друга без продвижения. Как два человека в коридоре, которые одновременно уступают друг другу дорогу в одну и ту же сторону.

// Пример livelock: два "вежливых" воркера
// Каждый уступает ресурс другому при конфликте
func worker(id int, res1, res2 *sync.Mutex) {
    for {
        res1.Lock()
        if !res2.TryLock() {
            res1.Unlock() // "уступаю!"
            continue      // попробую снова - livelock!
        }
        // работа...
        res2.Unlock()
        res1.Unlock()
        return
    }
}

Решения livelock:

  • Добавить случайную задержку перед повторной попыткой (jitter)
  • Ограничить число повторов
  • Использовать единый порядок захвата ресурсов

Livelock сложнее диагностировать, чем deadlock: программа не зависает, но потребляет CPU без результата. Go runtime обнаруживает deadlock (fatal error), но не livelock.

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.