Что такое мьютекс
Что проверяют
Понимаете ли вы взаимное исключение и переносите ли его на корутины. В мобильной разработке общее состояние сегодня трогают корутины на разных диспетчерах, поэтому ответ уровня учебника по потокам выдаёт отсутствие практики.
Как отвечать
Мьютекс это примитив синхронизации, который пускает в критическую секцию одного владельца, остальные ждут. Отличие от семафора стоит назвать сразу: у мьютекса есть владелец и освобождает блокировку тот же, кто её взял, а счётный семафор ограничивает число одновременных участников и владельца не помнит.
В Kotlin это Mutex из корутинной библиотеки, и устроен он иначе, чем synchronized: ожидание не блокирует поток, а приостанавливает корутину, поэтому поток продолжает обслуживать другие задачи.
private val mutex = Mutex()
private var cache: List<Item> = emptyList()
suspend fun update(items: List<Item>) = mutex.withLock {
cache = items
}withLock обязателен: он отпускает блокировку и при исключении, и при отмене корутины. Ручная пара захвата и освобождения рано или поздно теряет освобождение на ветке с ошибкой.
Что добавить для полноты: этот мьютекс не реентерабельный, повторный захват внутри уже занятой секции это гарантированное зависание. Блокировка выдаётся в порядке обращения. Сетевых вызовов под блокировкой быть не должно: пока одна корутина ждёт ответ, стоят все.
И главное: мьютекс это последнее средство. Сначала убирают само разделяемое состояние, оставляя одного владельца и поток состояния наружу.
Где спотыкаются
Смешивают два мира. Блокирующая секция на главном потоке съедает кадры, а попытка обернуть приостанавливаемый вызов в synchronized просто не компилируется, и кандидат не может объяснить почему.
Считают, что мьютекс защищает данные сам по себе. Защищает он только тот код, который его берёт: один забытый путь записи мимо блокировки, и гонка на месте, хотя мьютекс в проекте есть.
Захватывают блокировку повторно, не замечая этого: метод под блокировкой зовёт соседний, который тоже её берёт. Приложение зависает навсегда, без исключения и без стектрейса, и поиск причины занимает вечер.