Назад к вопросам
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 в одном порядке.