Какие знаешь варианты синхронизации в корутинах

«Какие знаешь варианты синхронизации в корутинах» — вопрос из категории Coroutines и Flow, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В корутинах есть несколько способов синхронизации:

  1. Mutex – блокирует доступ к общему ресурсу, пока одна корутина его использует:
val mutex = Mutex()
var counter = 0

launch {
    mutex.withLock {
        counter++
    }
}
  1. Actor – корутина с очередью сообщений, обрабатывающая запросы последовательно:
val counterActor = actor<Int> {
    var counter = 0
    for (msg in channel) {
        counter += msg
    }
}
  1. Flow с buffer – использование buffer() или conflate() для управления обработкой элементов.

  2. SharedFlow/StateFlow – потоковые решения с горячими данными, поддерживающие нескольких подписчиков.

  3. Semaphore – ограничивает количество корутин, одновременно работающих с ресурсом.

  4. Thread-safe коллекции – например, ConcurrentHashMap или AtomicInteger.