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

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

Компании, где спрашивали
Ecom.tech

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

sobes.tech AI

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

Чтобы избежать дедлоков:

  • Всегда захватывать блокировки в одном и том же порядке.
  • Использовать таймауты при попытке захвата блокировок (например, tryLock с таймаутом в java.util.concurrent.locks.Lock).
  • Минимизировать время удержания блокировок.
  • Использовать более высокоуровневые конструкции синхронизации (например, Semaphore, ConcurrentHashMap), которые снижают риск дедлоков.

Пример потенциального дедлока:

synchronized(lock1) {
    Thread.sleep(100);
    synchronized(lock2) {
        // работа
    }
}

// В другом потоке наоборот:

synchronized(lock2) {
    Thread.sleep(100);
    synchronized(lock1) {
        // работа
    }
}

Чтобы избежать, всегда захватывайте lock1 и lock2 в одном порядке.