Sobes.tech
Назад к вопросам
Senior
4

Что такое race condition? Как с ним бороться? Приведи пример и назови способы борьбы в Java.

Компании, где спрашивали
VKVK

Ответ от нейросети

sobes.tech AI

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

Пример race condition в Java:

public class Counter {
    private int count = 0;

    public void increment() {
        count = count + 1; // неатомарная операция
    }

    public int getCount() {
        return count;
    }
}

Если несколько потоков вызывают increment() одновременно, итоговое значение count может быть меньше ожидаемого.

Способы борьбы с race condition в Java:

  • Синхронизация (synchronized) — блокирует доступ к критической секции кода, позволяя выполнять её только одному потоку.

    public synchronized void increment() {
        count++;
    }
    
  • Использование атомарных классов из java.util.concurrent.atomic — например, AtomicInteger, который обеспечивает атомарные операции без блокировок.

    private AtomicInteger count = new AtomicInteger(0);
    public void increment() {
        count.incrementAndGet();
    }
    
  • Lock интерфейс (например, ReentrantLock) — более гибкий механизм блокировок.

  • Использование потокобезопасных коллекций и структур данных.

  • Избегать совместного доступа к изменяемым данным, использовать неизменяемые объекты или локальные копии.

Таким образом, race condition возникает из-за отсутствия правильной синхронизации доступа к общим ресурсам, и в Java для борьбы с ним применяются механизмы синхронизации, атомарные операции и блокировки.