Назад к вопросам
СБЕР
Senior
5
Что такое дедлок? Как его избежать?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Дедлок (взаимная блокировка) — ситуация в многопоточном или многопроцессном приложении, когда два или более потоков навсегда блокируют друг друга, ожидая освобождения ресурсов, занятых друг другом.
Пример: поток A захватил ресурс 1 и ждёт ресурс 2, а поток B захватил ресурс 2 и ждёт ресурс 1 — ни один из них не может продолжить работу.
Как избежать дедлок:
- Избегать вложенных блокировок: минимизировать количество одновременно захватываемых ресурсов.
- Упорядочить захват ресурсов: всегда захватывать ресурсы в одном и том же порядке во всех потоках.
- Использовать таймауты: при попытке захвата блокировки с таймаутом можно отказаться и повторить попытку позже.
- Использовать более высокоуровневые конструкции синхронизации: например,
java.util.concurrentпакеты, которые предоставляют безопасные примитивы. - Избегать удержания блокировок при вызове внешних методов: чтобы не создавать цепочки ожиданий.
В Java можно использовать tryLock с таймаутом:
if (lock1.tryLock(1000, TimeUnit.MILLISECONDS)) {
try {
if (lock2.tryLock(1000, TimeUnit.MILLISECONDS)) {
try {
// критическая секция
} finally {
lock2.unlock();
}
}
} finally {
lock1.unlock();
}
}
Таким образом, дедлок — это классическая проблема конкурентного программирования, и её предотвращение требует дисциплины в управлении ресурсами и блокировками.