Ответ
Atomic-классы — это набор классов из пакета java.util.concurrent.atomic, которые обеспечивают атомарные (неразрывные) операции над переменными в многопоточной среде без явной синхронизации (synchronized). Они реализуют lock-free алгоритмы, основанные на аппаратной поддержке операции CAS (Compare-And-Swap).
Основные классы:
AtomicInteger,AtomicLong— для атомарных операций с примитивными типами.AtomicReference<V>— для атомарных операций с ссылками на объекты.AtomicBoolean— для атомарных операций сboolean.
Пример использования:
import java.util.concurrent.atomic.AtomicInteger;
public class CounterExample {
private AtomicInteger counter = new AtomicInteger(0);
// Потокобезопасный инкремент
public void increment() {
counter.incrementAndGet(); // Атомарная операция: i++
}
// Использование CAS для условного обновления
public void updateIfZero(int newValue) {
boolean success = counter.compareAndSet(0, newValue); // Атомарно: if (value == 0) value = newValue
}
}
Преимущества перед synchronized:
- Высокая производительность: Избегание блокировок (lock-free) снижает накладные расходы и риск взаимоблокировок (deadlock).
- Гарантированная атомарность: Операции вроде
getAndSet(),incrementAndGet()выполняются как единое целое.
Ограничение: Подходят для простых атомарных операций. Сложные составные действия (например, «проверить-и-обновить» несколько переменных) могут потребовать внешней синхронизации или использования классов вроде AtomicReference для обновления составного состояния.