TGViewer
Java | Вопросы собесов Java | Вопросы собесов @easy_java_ru · 11.3K subscribers
Post #105 5.31K
Что такое race condition ?
Спросят с вероятностью 25%

Race condition (условие гонки) — это ситуация в многопоточной или распределенной системе, когда порядок выполнения операций влияет на результат работы программы, и этот порядок не может быть гарантирован. То есть, результат выполнения программы становится непредсказуемым из-за соревнования между потоками за доступ к общим ресурсам.

Часто возникают в следующих случаях:

1️⃣ Доступ к общим данным: Если два или более потока читают и пишут в одну и ту же переменную без должной синхронизации, конечное значение переменной может зависеть от того, в каком порядке потоки выполняют свои операции.
2️⃣ Зависимость от порядка выполнения: Когда корректность выполнения программы зависит от порядка выполнения операций между потоками, без явного контроля этого порядка.

Пример:
public class Counter {
private int count = 0;

public void increment() {
count++; // Несмотря на кажущуюся атомарность, операция не атомарна и состоит из трех шагов: чтение, инкремент, запись
}

public int getCount() {
return count;
}
}

public class RaceConditionDemo {
public static void main(String[] args) throws InterruptedException {
final Counter counter = new Counter();

Thread t1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});

Thread t2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});

t1.start();
t2.start();

t1.join();
t2.join();

System.out.println(counter.getCount()); // Ожидаемый результат 2000, но может быть меньше из-за условия гонки
}
}


В этом примере, хотя каждый поток пытается увеличить счетчик на 1000, итоговый результат может быть меньше 2000 из-за них. Это происходит потому, что операция инкремента (count++) не атомарна и может быть прервана между чтением значения count и записью обновленного значения обратно в память. В результате, несколько потоков могут прочитать одно и то же значение count перед тем, как другие потоки успеют его обновить.

Решение проблемы

Для предотвращения этого используются механизмы синхронизации, такие как блокировки (synchronized блоки в Java), мьютексы, семафоры и другие средства для контроля доступа к общим ресурсам. Эти механизмы гарантируют, что только один поток может выполнять критический участок кода, который взаимодействует с общим ресурсом, в любой момент времени.
public synchronized void increment() {
count++;
}


Добавление synchronized к методу increment() гарантирует, что в каждый момент времени только один поток может выполнить этот метод, что предотвращает условия гонки в данном случае.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1715 вопроса на Java разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
  • 👍 11
  • ❤ 6
More from @easy_java_ru
  1. Oct 12, 2026🤔 Жизненный цикл сервлетов? 1. Загрузка и инициализация (init); 2. Обработка запроса (ser…
  2. Oct 12, 2026🤔 Как остановить поток? Остановить поток в Java можно несколькими способами, но важно пом…
  3. Oct 11, 2026🤔 Какой класс позволяет читать данные из входного байтового потока в формате примитивных…
  4. Oct 11, 2026🤔 Чем отличается where от having ? WHERE и HAVING используются для фильтрации записей, но…
  5. Oct 10, 2026🤔 На основании какой структуры данных реализован ArrayList? ArrayList реализован на базе…
  6. Oct 9, 2026🤔 Что такое «HTML»? HTML (HyperText Markup Language) — это язык разметки, используемый дл…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →