Ответ
При конкурентном изменении 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) или синхронизацию.