Выбор ответа Middle Потоки и Java Memory Model спрашивают часто обновлено
Как избежать дедлока
Вопрос
Два метода переводят деньги между счетами и блокируют оба счёта. Какой способ надёжно исключает взаимную блокировку между ними?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Всегда захватывать блокировки в одном порядке, например по id. Дедлок возникает, когда потоки ждут блокировки друг друга по кругу.
Варианты ответа
- Сделать поля балансов счетов volatile, чтобы потоки видели изменения
- Вызывать
Thread.yield()между захватами первого и второго счёта - Всегда захватывать блокировки в одном порядке, например по idправильный ответ
- Увеличить число потоков в пуле, чтобы ожидающие не мешали другим
Разбор
Дедлок возникает, когда потоки ждут блокировки друг друга по кругу. Глобальный порядок захвата разрывает цикл. volatile ничего не блокирует и не помогает. yield только подсказывает планировщику и ничего не гарантирует. Больше потоков не развяжут уже сцепившиеся.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.