Короткий ответ Состояние гонки — это ситуация, когда результат многопоточной программы зависит от порядка и скорости выполнения потоков и становится непредсказуемым. Гонка возникает, когда несколько потоков без синхронизации обращаются к одним и тем же разделяемым данным и хотя бы один из них выполняет запись; итог зависит от того, какой поток «добежал» первым. Как это работает подробнее Типичный пример — несколько потоков увеличивают общий счётчик. Операция count++ состоит из трёх шагов: прочитать текущее значение, прибавить единицу, записать результат обратно. Два потока могут прочитать одно и то же значение, каждый вычислит следующее число, и в поле будет записано то же значение — одно увеличение потеряно (lost update). Гонка коварна тем, что проявляется не сразу: она часто «выстреливает» только под нагрузкой или на другом железе, из-за чего баги нерегулярно воспроизводятся. Три основных способа борьбы: атомарные классы (AtomicInteger) для одной составной операции; synchronized или Lock для более крупной к