Что такое race condition? Как с ним бороться? Приведи пример и назови способы борьбы в Java.
Ответ от нейросети
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 для борьбы с ним применяются механизмы синхронизации, атомарные операции и блокировки.