← Назад к вопросам

Что такое атомарные типы?

2.0 Middle🔥 201 комментариев
#Многопоточность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Атомарные типы

Атомарные типы — это специальные классы из пакета java.util.concurrent.atomic, которые предоставляют потокобезопасные операции над переменными без использования явной синхронизации. Они основаны на аппаратных атомарных инструкциях процессора (compare-and-swap операции, CAS).

Основные атомарные классы

В Java есть несколько групп атомарных типов:

1. AtomicInteger, AtomicLong, AtomicBoolean

AtomicInteger counter = new AtomicInteger(0);
counter.incrementAndGet();  // атомарное увеличение на 1
counter.getAndAdd(5);       // добавить 5 и вернуть старое значение
counter.compareAndSet(5, 10); // CAS операция

2. AtomicReference — для атомарных операций с объектами

AtomicReference<String> ref = new AtomicReference<>("initial");
ref.compareAndSet("initial", "updated");

3. AtomicIntegerArray, AtomicLongArray — для массивов

AtomicIntegerArray array = new AtomicIntegerArray(10);
array.incrementAndGet(0); // увеличить элемент с индексом 0

4. AtomicMarkableReference, AtomicStampedReference — версионированные ссылки

AtomicStampedReference<String> ref = new AtomicStampedReference<>("value", 0);
int[] stamp = new int[1];
String value = ref.get(stamp); // получить значение и версию

Как они работают

Атомарные операции реализуют на уровне процессора через CAS (Compare-And-Swap):

// Псевдокод того, что происходит внутри
public int incrementAndGet() {
  int current, next;
  do {
    current = value;       // прочитали текущее значение
    next = current + 1;    // вычислили новое
  } while (!compareAndSet(current, next)); // пока не удалось заменить атомарно
  return next;
}

Преимущества над synchronized

  • Нет блокировок — используются аппаратные инструкции
  • Лучше масштабируемость — в многопоточных приложениях нет contention
  • Неблокирующие алгоритмы — можно писать lock-free структуры данных
  • Более гибкие — поддерживают сложные операции (CAS)

Практические примеры

Счётчик в многопоточной среде:

public class Counter {
  private AtomicLong count = new AtomicLong(0);
  
  public void increment() {
    count.incrementAndGet();
  }
  
  public long getCount() {
    return count.get();
  }
}

Lock-free очередь:

public class LockFreeStack<T> {
  private AtomicReference<Node<T>> head = new AtomicReference<>();
  
  private static class Node<T> {
    final T value;
    Node<T> next;
    Node(T value) { this.value = value; }
  }
  
  public void push(T value) {
    Node<T> newHead = new Node<>(value);
    Node<T> oldHead;
    do {
      oldHead = head.get();
      newHead.next = oldHead;
    } while (!head.compareAndSet(oldHead, newHead));
  }
}

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

  • Счётчики, флаги в многопоточных приложениях
  • Кэши, когда нужна потокобезопасная замена значения
  • Lock-free алгоритмы и структуры данных
  • Когда contention критичен для performance

Атомарные типы — мощный инструмент для параллельного программирования в Java, но требуют понимания их семантики.

Что такое атомарные типы? | PrepBro