Что такое Race Condition в контексте Flutter/Dart?

«Что такое Race Condition в контексте Flutter/Dart?» — вопрос из категории Асинхронность, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Race Condition (состояние гонки) — это ошибка многопоточного или асинхронного программирования, когда результат выполнения зависит от непредсказуемого порядка доступа к общим данным. В Dart/Flutter это особенно актуально при работе с async/await и изолятами.

Типичный пример в Dart:

int counter = 0;

Future<void> unsafeIncrement() async {
  int current = counter; // Чтение значения
  await Future.delayed(Duration(milliseconds: 10)); // Асинхронная пауза
  counter = current + 1; // Запись нового значения
}

// Параллельный вызов:
await Future.wait([
  unsafeIncrement(),
  unsafeIncrement(),
]);
print(counter); // Может быть 1 вместо ожидаемых 2

Причины в Flutter:

  1. Асинхронные операции с общим состоянием
  2. Параллельное выполнение в нескольких изолятах
  3. Обновление состояния виджета из разных источников

Способы предотвращения:

  • Использование synchronized пакета:
    
    import 'package:synchronized/synchronized.dart';
    final _lock = Lock();

Future safeIncrement() async { await _lock.synchronized(() async { counter++; }); }


- **Атомарные операции через `AtomicInteger` из `dart:ffi`**
- **Потокобезопасные структуры данных** (`Concurrent` коллекции)
- **State management с гарантиями:** Riverpod, BloC с правильной синхронизацией
- **Локальное состояние в изолятах** + обмен через сообщения