Ответ
Coroutines сами по себе не защищают от race condition. Они лишь упрощают асинхронный код, но параллельный доступ к общим ресурсам всё равно требует синхронизации.
Для защиты используй:
Mutex- блокирует доступ к критической секции@Volatile- для примитивов- Потокобезопасные коллекции (
ConcurrentHashMapи т.д.)
Пример с Mutex:
val mutex = Mutex()
var counter = 0
fun safeIncrement() = runBlocking {
mutex.withLock {
counter++
}
}