Выбор ответа Middle Потоки и Java Memory Model спрашивают часто обновлено

Как избежать дедлока

Вопрос

Два метода переводят деньги между счетами и блокируют оба счёта. Какой способ надёжно исключает взаимную блокировку между ними?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Всегда захватывать блокировки в одном порядке, например по id. Дедлок возникает, когда потоки ждут блокировки друг друга по кругу.

Варианты ответа

  1. Сделать поля балансов счетов volatile, чтобы потоки видели изменения
  2. Вызывать Thread.yield() между захватами первого и второго счёта
  3. Всегда захватывать блокировки в одном порядке, например по idправильный ответ
  4. Увеличить число потоков в пуле, чтобы ожидающие не мешали другим

Разбор

Дедлок возникает, когда потоки ждут блокировки друг друга по кругу. Глобальный порядок захвата разрывает цикл. volatile ничего не блокирует и не помогает. yield только подсказывает планировщику и ничего не гарантирует. Больше потоков не развяжут уже сцепившиеся.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме