Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Kotlin: deadlock, livelock, multithreading

Как избежать deadlock/livelock при работе с блокировками?

Вопрос объясняет методы предотвращения взаимных блокировок в многопоточной среде.

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

  1. Избегайте вложенных блокировок.

  2. Используйте таймауты (например, tryLock(timeout)).

  3. Упорядочивайте блокировки (всегда получайте lockA перед lockB).

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

1. Deadlock

Возникает, когда потоки блокируют друг друга, ожидая ресурсы.

Способы избежать:

  • Упорядочивание блокировок:
    Всегда получайте блокировки в одинаковом порядке.

    // Правильно: lockA -> lockB
    synchronized(lockA) {
        synchronized(lockB) { ... }
    }
  • Таймауты:
    Используйте tryLock с таймаутом.

    if (lock.tryLock(1, TimeUnit.SECONDS)) {
        try { /* работа */ } 
        finally { lock.unlock() }
    }

2. Livelock

Потоки постоянно меняют состояние, но не прогрессируют.

Пример:

// Два потока "вежливо" уступают друг другу
while (!acquireLock()) {
    Thread.yield() // Livelock!
}

Решение:

  • Добавьте случайные задержки (Thread.sleep(randomDelay)).

Вывод:
Планируйте блокировки заранее и используйте таймауты.

  • Аватар

    Android Guru

    Anton Gulyaev

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    2

  • Сложность:

    5

Навыки

  • Kotlin

    Kotlin

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

#deadlock

#livelock

#multithreading

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

  • Аватар

    Android Guru

    Anton Gulyaev

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.