Easyrace-condition

Что такоеrace condition и как предотвратить?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Race condition — результат зависит от порядка выполнения потоков. Классика: counter++ из многих потоков = потерянные обновления (read + inc + write, гонки между ними).

// ПЛОХО: data race, потерянные обновления
int counter = 0;
// много потоков: counter++;  // read-modify-write, гонка

// Хорошо: AtomicInteger (lock-free)
AtomicInteger counter = new AtomicInteger();
counter.incrementAndGet();

// check-then-act: гонка
if (map.get(k) == null) map.put(k, v);
// Исправить: map.computeIfAbsent(k, key -> v);

Профилактика:

  • synchronization (synchronized, Lock);
  • atomic classes (AtomicInteger, LongAdder);
  • immutable objects (final fields);
  • thread confinement (один поток);
  • concurrent collections (ConcurrentHashMap);
  • правильный happens-before через volatile/synchronized.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.