Требуется ли синхронизация при изменении переменной 500 корутинами на Dispatchers.Main и 500 корутинами на Dispatchers.IO

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

Ответ

Изменение переменной из нескольких корутин требует синхронизации, если:

  1. Переменная mutable (например, var counter = 0)
  2. Операция неатомарная (например, counter++ - это read + increment + write)

Пример опасного кода:

var counter = 0
repeat(1000) {
    launch(Dispatchers.IO) { counter++ }
}
// Результат может быть меньше 1000 из-за гонки данных

Решение:

  1. Используйте атомарные типы (AtomicInteger)
  2. Применяйте мьютексы (withLock)
  3. Используйте потокобезопасные структуры (Channel, Flow)

Пример с Mutex:

val mutex = Mutex()
var counter = 0
repeat(1000) {
    launch(Dispatchers.IO) {
        mutex.withLock { counter++ }
    }
}

Dispatchers.Main или IO не влияют на необходимость синхронизации - важно только конкурентное изменение состояния.