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

Что такое дедлок? Как его избежать?

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

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

sobes.tech AI

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

Пример: поток A захватил ресурс 1 и ждёт ресурс 2, а поток B захватил ресурс 2 и ждёт ресурс 1 — ни один из них не может продолжить работу.

Как избежать дедлок:

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

В Java можно использовать tryLock с таймаутом:

if (lock1.tryLock(1000, TimeUnit.MILLISECONDS)) {
    try {
        if (lock2.tryLock(1000, TimeUnit.MILLISECONDS)) {
            try {
                // критическая секция
            } finally {
                lock2.unlock();
            }
        }
    } finally {
        lock1.unlock();
    }
}

Таким образом, дедлок — это классическая проблема конкурентного программирования, и её предотвращение требует дисциплины в управлении ресурсами и блокировками.