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 подскажет развёрнутый ответ в реальном времени.