Как влияет добавление или удаление элементов из Flow конкурентно во время его активного сбора

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

Ответ

При конкурентном изменении Flow во время сбора возможны race conditions. Flow — это холодный поток, и его элементы вычисляются лениво при каждом вызове collect.

Если изменять источник данных (например, MutableStateFlow) во время сбора, поведение зависит от типа Flow:

  • StateFlow/SharedFlow: Гарантируют консистентность — коллектор получит последнее значение после изменения.
  • Обычные Flow (например, flow {}): Могут пропускать или дублировать элементы, если источник изменяется во время эмиссии.
val stateFlow = MutableStateFlow(0)

// Коллектор
launch {
    stateFlow.collect { println(it) } // Безопасно, получит все изменения
}

// Конкурентное изменение
launch {
    repeat(10) { i ->
        delay(100)
        stateFlow.value = i // Коллектор получит все значения 0..9
    }
}

Для thread safety используйте потокобезопасные структуры (например, MutableStateFlow) или синхронизацию.