Какие знаешь способы синхронизации доступа корутин к объекту

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

Ответ

В Kotlin для синхронизации доступа корутин к общему ресурсу можно использовать:

  1. Mutex – блокирует выполнение только одной корутины:
val mutex = Mutex()
var counter = 0

launch {
    mutex.withLock {
        counter++
    }
}
  1. Атомарные типы (AtomicInteger и др.) для простых операций:
val counter = AtomicInteger(0)
launch { counter.incrementAndGet() }
  1. Actor – корутина с очередью сообщений:
val counterActor = actor<Int> {
    var counter = 0
    for (msg in channel) { counter += msg }
}
  1. Потокобезопасные коллекции (ConcurrentHashMap и др.)

  2. @Volatile для примитивов (но не гарантирует атомарность сложных операций)

Mutex предпочтительнее для сложных операций, атомарные типы – для простых инкрементов.