Что такое Atomic-классы в Java?

«Что такое Atomic-классы в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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:

  1. Высокая производительность: Избегание блокировок (lock-free) снижает накладные расходы и риск взаимоблокировок (deadlock).
  2. Гарантированная атомарность: Операции вроде getAndSet(), incrementAndGet() выполняются как единое целое.

Ограничение: Подходят для простых атомарных операций. Сложные составные действия (например, «проверить-и-обновить» несколько переменных) могут потребовать внешней синхронизации или использования классов вроде AtomicReference для обновления составного состояния.