← Назад к вопросам
Что такое race condition? Как предотвратить гонку данных в многопоточном коде?
1.8 Middle🔥 191 комментариев
#Многопоточность и асинхронность
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое race condition
Race condition (гонка данных) — это ошибка, когда несколько потоков одновременно обращаются к общему ресурсу, и результат зависит от порядка их выполнения.
Пример
var counter = 0
repeat(10) {
Thread { repeat(100) { counter++ } }.start()
}
Thread.sleep(1000)
println(counter) // Может быть 500, а не 1000
Способы предотвращения
- Synchronized блок — только один поток в раз
synchronized(lock) { counter++ }
- AtomicInteger — потокобезопасные операции
val counter = AtomicInteger(0)
counter.incrementAndGet()
- Mutex (Coroutines) — асинхронная синхронизация
mutex.withLock { counter++ }
- ReentrantLock — гибкая блокировка
lock.withLock { counter++ }
- Main Dispatcher (Android) — для UI состояния
viewModelScope.launch { state.value = newValue }
- ConcurrentCollections — потокобезопасные коллекции
val map = ConcurrentHashMap<String, Int>()
- SELECT FOR UPDATE (БД) — атомарный выбор с блокировкой
SELECT * FROM users WHERE id = 1 FOR UPDATE SKIP LOCKED
Золотое правило
Если ресурс может быть изменен несколькими потоками одновременно — защити его синхронизацией.