Sobes.tech
Senior
27

Was ist ein Race Condition? Wie kann man dagegen vorgehen? Gib ein Beispiel und nenne die Methoden der Bekämpfung in Java.

Unternehmen wurden gefragt
VKVK

Antwort von AI

sobes.tech KI

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 для борьбы с ним применяются механизмы синхронизации, атомарные операции и блокировки.