Сталкивались ли вы с deadlock?
Что проверяют
Вопрос звучит как «был ли опыт», но проверяют механику: понимаете ли вы условия возникновения взаимной блокировки, знаете ли, как она выглядит в Android снаружи, и умеете ли её искать, а не переписывать код наугад.
Как отвечать
Сначала определение: два или больше потоков ждут ресурсы, захваченные друг другом, по кругу. Нужны взаимное исключение, удержание ресурса во время ожидания, отсутствие вытеснения и циклическое ожидание. Снаружи в Android это почти всегда выглядит как зависание интерфейса и последующее принудительное закрытие системой.
Дальше типичные для платформы случаи:
- блокирующее ожидание на главном потоке, а внутри работа, которой сам главный поток и нужен: поток ждёт сам себя;
- мьютекс корутин не реентерабельный, поэтому повторный захват из той же корутины внутри критической секции вешает её навсегда, в отличие от
synchronized; - два монитора, захватываемые в разном порядке в разных местах кода;
- обращение к базе с главного потока одновременно с длинной фоновой транзакцией.
Потом как чинили: единый порядок захвата блокировок, сужение критической секции, замена разделяемого изменяемого состояния на передачу сообщений и неизменяемые данные, попытка захвата с таймаутом там, где без блокировки не обойтись. Диагностика: трассировка зависания из системы или консоли разработчика, дамп потоков, состояние BLOCKED и монитор, которого ждёт поток.
Если опыта не было, так и скажите и разберите вслух, как стали бы искать.
Где спотыкаются
Рассказывают историю, которая взаимной блокировкой не является: долгая операция на главном потоке или состояние гонки. Интервьюер задаёт один вопрос про цикл ожидания, и рассказ разваливается.
Предлагают таймаут как решение. Таймаут превращает намертво зависшее приложение в редкую плавающую ошибку, причина остаётся на месте, а воспроизводить её становится сложнее.
Считают любое зависание взаимной блокировкой и не умеют читать трассировку потоков. Чаще виноваты тяжёлый ввод-вывод или сеть на главном потоке, и лечится это совсем другим.