Ответ
Изменение переменной из нескольких корутин требует синхронизации, если:
- Переменная mutable (например,
var counter = 0) - Операция неатомарная (например,
counter++- это read + increment + write)
Пример опасного кода:
var counter = 0
repeat(1000) {
launch(Dispatchers.IO) { counter++ }
}
// Результат может быть меньше 1000 из-за гонки данных
Решение:
- Используйте атомарные типы (
AtomicInteger) - Применяйте мьютексы (
withLock) - Используйте потокобезопасные структуры (
Channel,Flow)
Пример с Mutex:
val mutex = Mutex()
var counter = 0
repeat(1000) {
launch(Dispatchers.IO) {
mutex.withLock { counter++ }
}
}
Dispatchers.Main или IO не влияют на необходимость синхронизации - важно только конкурентное изменение состояния.