Вопрос проверяет понимание более широкой концепции состояний гонки, которая включает в себя логические ошибки в порядке выполнения операций.
Race Condition (состояние гонки) — это ошибка проектирования, при которой корректность работы программы зависит от относительной временной последовательности или порядка выполнения действий несколькими потоками. В отличие от Data Race, это более высокоуровневая логическая ошибка, которая может возникать даже при правильной синхронизации доступа к данным.
Состояние гонки возникает, когда логика программы делает неверное предположение о том, в каком порядке будут выполняться потоки.
Классический пример: Проверка-затем-действие (Check-then-Act)
Допустим, два потока хотят создать файл, если он не существует.
Оба потока проверяют, существует ли файл X. Оба видят, что его нет.
Оба потока решают, что им нужно создать файл.
Оба потока пытаются создать файл X. Это приводит к ошибке или перезаписи.
Проблема здесь не в том, что потоки одновременно пишут в память (Data Race), а в том, что логика «проверить и потом создать» не является атомарной операцией. Между проверкой и действием состояние системы может измениться другим потоком.
Пример на Java (проверка баланса перед списанием):
public class RaceConditionExample {
private static int balance = 100;
public static void withdraw(int amount) {
// Check-then-Act
if (balance >= amount) { // 1. Проверка баланса
// Между проверкой и списанием может вклиниться другой поток
balance = balance - amount; // 2. Списание
System.out.println("Списано " + amount + ", остаток: " + balance);
} else {
System.out.println("Недостаточно средств");
}
}
public static void main(String[] args) throws InterruptedException {
// Два потока пытаются списать 100 рублей каждый
Thread thread1 = new Thread(() -> withdraw(100));
Thread thread2 = new Thread(() -> withdraw(100));
thread1.start();
thread2.start();
thread1.join();
thread2.join();
}
}Возможный вывод:Списано 100, остаток: 0Списано 100, остаток: -100
Оба потока прошли проверку if (balance >= 100), увидев баланс = 100, а затем оба произвели списание.
Вывод: Race Condition — это ошибка проектирования логики, а не просто ошибка доступа к памяти. Для ее предотвращения необходимо делать критические секции атомарными с помощью правильной синхронизации.