Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: deadlock, concurrency

Как можно избежать deadlock?

Этот вопрос проверяет понимание многопоточности, синхронизации и умение проектировать безопасный конкурентный код.

Короткий ответ

Deadlock возникает, когда потоки навсегда ждут освобождения ресурсов друг от друга. Чтобы его избежать, нужно соблюдать единый порядок захвата блокировок, минимизировать синхронизацию и избегать вложенных lock. Также помогают таймауты, неблокирующие структуры данных и высокоуровневые concurrency-абстракции. Проектирование играет ключевую роль. Deadlock проще предотвратить, чем обнаружить.

Длинный ответ

Определение

Deadlock — это ситуация, при которой несколько потоков блокируют друг друга, ожидая освобождения ресурсов, и ни один из них не может продолжить выполнение.

Основные причины deadlock

Deadlock возможен, если одновременно выполняются условия:

  • взаимное исключение

  • удержание ресурса и ожидание другого

  • отсутствие принудительного освобождения

  • циклическое ожидание

Способы предотвращения

Перед применением техник важно понимать архитектуру синхронизации.

Единый порядок захвата блокировок

Самый надёжный способ.

synchronized (lockA) {
    synchronized (lockB) {
        // безопасный код
    }
}

Все потоки должны захватывать ресурсы в одном порядке.

Минимизация синхронизации

  • уменьшать размер synchronized-блоков

  • не выполнять долгие операции под lock

  • выносить вычисления за пределы блокировки

Использование tryLock

С ReentrantLock можно использовать таймаут:

if (lock.tryLock()) {
    try {
        // работа
    } finally {
        lock.unlock();
    }
}

Это позволяет:

  • не зависать навсегда

  • корректно реагировать на невозможность захвата

Высокоуровневые инструменты

  • ExecutorService

  • ConcurrentHashMap

  • атомарные классы

Они уменьшают необходимость ручной синхронизации.

Вывод

Deadlock — следствие плохого дизайна синхронизации. Лучший способ борьбы с ним — правильная архитектура и минимизация блокировок.

Уровень

  • Рейтинг:

    5

  • Сложность:

    8

Навыки

  • Java

    Java

Ключевые слова

#deadlock

#concurrency

Подпишись на Java Developer в телеграм