Что такое Atomic-типы (в контексте многопоточности)?

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

Ответ

Atomic-типы — это общее название для классов, предоставляющих атомарные (неделимые) операции над переменными в конкурентных сценариях. В Java они представлены пакетом java.util.concurrent.atomic. Их основная цель — обеспечить потокобезопасность для отдельных операций без использования блокировок, что решает проблемы состояния гонки (race condition).

Принцип работы: В основе лежит низкоуровневая операция процессора CAS (Compare-And-Swap), которая атомарно сравнивает текущее значение переменной с ожидаемым и, если они совпадают, устанавливает новое значение.

Ключевые Atomic-классы в Java:

  • Для чисел: AtomicInteger, AtomicLong.
  • Для ссылок на объекты: AtomicReference<T>.
  • Для массивов: AtomicIntegerArray, AtomicReferenceArray.
  • Для обновляемых полей: AtomicIntegerFieldUpdater (позволяет сделать атомарным существующее volatile поле).

Пример (AtomicReference):

import java.util.concurrent.atomic.AtomicReference;

class Config {
    private AtomicReference<String> currentMode = new AtomicReference<>("default");

    public void switchToSafeMode() {
        // Атомарно меняем режим только если текущий — "default"
        currentMode.compareAndSet("default", "safe");
    }

    public String getMode() {
        return currentMode.get();
    }
}

Когда использовать:

  • Для счетчиков, флагов, простых состояний в высоконагруженных многопоточных приложениях.
  • Когда нужно избежать накладных расходов на блокировки (synchronized, Lock).

Когда не использовать: Для сложных операций, затрагивающих несколько независимых переменных — в таких случаях требуется явная синхронизация.