Ответ
Deadlock возникает, когда потоки взаимно блокируют друг друга, ожидая освобождения ресурсов. Основные способы предотвращения:
- Упорядоченное получение блокировок
Всегда захватывать блокировки в одинаковом порядке. Например:
// Правильно:
synchronized(lockA) {
synchronized(lockB) { ... }
}
// Опасно:
synchronized(lockB) {
synchronized(lockA) { ... } // может привести к deadlock
}
- Использование таймаутов
ПрименятьtryLock()с таймаутом вместо блокирующих вызовов:
if (lockA.tryLock(100, TimeUnit.MILLISECONDS)) {
try {
if (lockB.tryLock(100, TimeUnit.MILLISECONDS)) {
// работа с ресурсами
}
} finally {
lockB.unlock()
lockA.unlock()
}
}
-
Избегание вложенных блокировок
Рефакторинг кода для уменьшения областей синхронизации. -
Использование атомарных операций
Замена блокировок наAtomic-классы где возможно. -
Анализ зависимостей
Выявление циклических зависимостей между потоками на этапе проектирования.