Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: concurrency, logic, atomicity

Что такое Race Condition? Приведи пример.

Вопрос проверяет понимание более широкой концепции состояний гонки, которая включает в себя логические ошибки в порядке выполнения операций.

Короткий ответ

Race Condition (состояние гонки) — это ошибка проектирования, при которой корректность работы программы зависит от относительной временной последовательности или порядка выполнения действий несколькими потоками. В отличие от Data Race, это более высокоуровневая логическая ошибка, которая может возникать даже при правильной синхронизации доступа к данным.

Длинный ответ

Состояние гонки возникает, когда логика программы делает неверное предположение о том, в каком порядке будут выполняться потоки.

Классический пример: Проверка-затем-действие (Check-then-Act)
Допустим, два потока хотят создать файл, если он не существует.

  1. Оба потока проверяют, существует ли файл X. Оба видят, что его нет.

  2. Оба потока решают, что им нужно создать файл.

  3. Оба потока пытаются создать файл 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 — это ошибка проектирования логики, а не просто ошибка доступа к памяти. Для ее предотвращения необходимо делать критические секции атомарными с помощью правильной синхронизации.

Уровень

  • Рейтинг:

    2

  • Сложность:

    7

Навыки

  • Java

    Java

Ключевые слова

#concurrency

#logic

#atomicity

Подпишись на Java Developer в телеграм