Дедлок (взаимная блокировка) — это ситуация, когда два или более потока ожидают друг друга бесконечно, потому что каждый из них держит ресурс, который нужен другому потоку для продолжения выполнения.
Для возникновения дедлока необходимы четыре условия (условия Коффмана):
Стратегии предотвращения и избегания дедлоков:
Нарушение одного из условий Коффмана:
Алгоритм банкира (Banker's Algorithm): Динамическое избегание дедлоков. Систематически анализирует запросы ресурсов и разрешает их только в "безопасных" состояниях, гарантируя, что всегда найдется последовательность завершения всех потоков. Сложный в реализации и может быть неэффективен для большого числа ресурсов и потоков.
Примеры реализации на Java:
Пример дедлока:
java
Пример предотвращения дедлока (упорядоченный захват ресурсов):
java
Использование высокоуровневых абстракций, таких как java.util.concurrent.locks.ReentrantReadWriteLock или java.util.concurrent.Semaphore, а также правильное проектирование многопоточных приложений существенно снижают риск возникновения дедлоков. Методы, такие как tryLock(), позволяют попытаться захватить блокировку без блокировки потока и избежать ожидания.