Как синхронизировать работу корутин

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

Ответ

В Kotlin корутины можно синхронизировать с помощью:

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

fun main() = runBlocking {
    repeat(100) {
        launch {
            mutex.withLock {
                counter++
            }
        }
    }
}
  1. Actor – инкапсулирует состояние и обрабатывает сообщения последовательно:
val counterActor = actor<Int> {
    var counter = 0
    for (msg in channel) {
        counter += msg
    }
}
  1. Потокобезопасные структуры (Atomic, Concurrent коллекции).

  2. @Volatile для примитивов (но лучше использовать Atomic).

Для сложных сценариев предпочтительнее Mutex или Actor, так как они обеспечивают последовательный доступ без блокировки потока.