Что такое deadlock? В чём отличие от race condition? Как избежать deadlock, в том числе если невозможно определить порядок захвата локов заранее?

Deadlock — это ситуация в многопоточном приложении, когда два или более потоков навсегда блокируют друг друга, ожидая освобождения ресурсов, которые захвачены другими потоками.

Короткий ответ

Что ответить на собеседовании

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

Подробный разбор

Ответ с пояснениями

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

Отличие от race condition:

  • Deadlock — взаимная блокировка потоков, приводящая к остановке.
  • Race condition — состояние гонки, когда результат зависит от непредсказуемого порядка выполнения потоков, что может привести к ошибкам.

Чтобы избежать deadlock, особенно если заранее нельзя определить порядок захвата локов, можно использовать следующие подходы:

  1. Попытка захвата с таймаутом или без блокировки: использовать методы tryLock, которые пытаются захватить лок и, если не получается, освобождают уже захваченные ресурсы и повторяют попытку позже.
  2. Иерархия локов: если возможно, установить строгий порядок захвата ресурсов, чтобы избежать циклических ожиданий.
  3. Использование высокоуровневых конструкций: например, java.util.concurrent пакета, где есть классы, минимизирующие риск deadlock.
  4. Дизайн без блокировок: использовать неблокирующие алгоритмы и структуры данных.

Пример с tryLock:

Lock lock1 = ...;
Lock lock2 = ...;

while (true) {
    if (lock1.tryLock()) {
        try {
            if (lock2.tryLock()) {
                try {
                    // работа с ресурсами
                    break;
                } finally {
                    lock2.unlock();
                }
            }
        } finally {
            lock1.unlock();
        }
    }
    // пауза или другая логика перед повтором
}

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

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее