Ответ
Да, синхронизация необходима, так как инкремент (count++) не является атомарной операцией. Даже если корутины работают в разных потоках (IO и Main), может возникнуть состояние гонки.
Пример с Mutex:
val mutex = Mutex()
var count = 0
fun increment() = runBlocking {
repeat(100) {
launch(Dispatchers.IO) {
mutex.withLock {
count++
}
}
}
}
Альтернативы:
AtomicIntegerдля простых случаевsynchronizedблоки (но менее идиоматично для корутин)@Volatileне поможет, так как не делает операцию атомарной