Sobes.tech
Назад к вопросам
Senior
6

Что такое livelock между двумя потоками и как его избежать?

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

Livelock — это ситуация, когда два или более потоков постоянно реагируют друг на друга, пытаясь избежать взаимной блокировки, но при этом не могут продвинуться дальше, постоянно меняя состояние.

В отличие от deadlock, где потоки ждут друг друга, при livelock потоки активны, но не делают полезной работы.

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

Как избежать livelock:

  • Использовать более строгие протоколы захвата ресурсов, например, фиксированный порядок захвата.
  • Вводить случайные задержки (backoff) перед повторной попыткой захвата.
  • Использовать высокоуровневые конструкции синхронизации из java.util.concurrent, которые минимизируют риск livelock.

Пример с backoff:

while (true) {
    if (tryLock(resource1)) {
        if (tryLock(resource2)) {
            // Работа с ресурсами
            unlock(resource2);
            unlock(resource1);
            break;
        } else {
            unlock(resource1);
            Thread.sleep(randomBackoff());
        }
    } else {
        Thread.sleep(randomBackoff());
    }
}