← Назад к вопросам

Что такое 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

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

  1. Synchronized блок — только один поток в раз
synchronized(lock) { counter++ }
  1. AtomicInteger — потокобезопасные операции
val counter = AtomicInteger(0)
counter.incrementAndGet()
  1. Mutex (Coroutines) — асинхронная синхронизация
mutex.withLock { counter++ }
  1. ReentrantLock — гибкая блокировка
lock.withLock { counter++ }
  1. Main Dispatcher (Android) — для UI состояния
viewModelScope.launch { state.value = newValue }
  1. ConcurrentCollections — потокобезопасные коллекции
val map = ConcurrentHashMap<String, Int>()
  1. SELECT FOR UPDATE (БД) — атомарный выбор с блокировкой
SELECT * FROM users WHERE id = 1 FOR UPDATE SKIP LOCKED

Золотое правило

Если ресурс может быть изменен несколькими потоками одновременно — защити его синхронизацией.

Что такое race condition? Как предотвратить гонку данных в многопоточном коде? | PrepBro