Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: concurrency, thread, memory

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

Вопрос проверяет понимание низкоуровневых проблем параллелизма, связанных с неконтролируемым доступом к памяти.

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

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

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

Data Race — это ситуация неопределенного поведения программы из-за неконтролируемого доступа к общим данным.

Условия возникновения Data Race:

  1. Как минимум два потока обращаются к одной переменной.

  2. Как минимум один поток изменяет (пишет) эту переменную.

  3. Нет механизма синхронизации (например, synchronized, мьютекса), который бы гарантировал порядок доступа.

Пример на Java:
Рассмотрим простой счетчик, который увеличивается из нескольких потоков.

public class DataRaceExample {
    private static int counter = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 100000; i++) {
                counter++; // Не атомарная операция: чтение -> изменение -> запись
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 100000; i++) {
                counter++;
            }
        });

        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();

        System.out.println("Counter value: " + counter); // Результат меньше 200000
    }
}

Почему результат не равен 200000?
Операция counter++ не является атомарной. Она состоит из трех шагов:

  1. Прочитать текущее значение counter в регистр процессора.

  2. Увеличить значение в регистре на 1.

  3. Записать новое значение обратно в память.

Потоки могут выполнять эти шаги вперемешку. Например, оба потока прочитают значение 5, увеличат его до 6 каждый и запишут 6. В результате два увеличения дадут +1 вместо +2.

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

Уровень

  • Рейтинг:

    2

  • Сложность:

    7

Навыки

  • Java

    Java

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

#concurrency

#thread

#memory

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