> Что такое атомики и почему они быстрее мьютексов в Go (Go)

Уровень: junior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: VK

Стек: Go

> Пример ответа

Атомики (atomic operations) в Go - это низкоуровневые примитивы синхронизации из пакета sync/atomic, которые выполняют неделимые операции над памятью (например, Add, Load, Store, CAS - Compare And Swap). Они работают на уровне инструкций процессора (например, LOCK CMPXCHG на x86), что гарантирует атомарность без блокировок.

Атомики быстрее мьютексов по нескольким причинам:

  1. Отсутствие блокировок: Мьютекс при захвате переводит горутину в режим ожидания (park), что требует переключения контекста ядра ОС - это дорого (сотни наносекунд). Атомик же просто выполняет одну инструкцию CPU (обычно 1-10 нс) без участия планировщика.
  2. Spin-lock vs Park: Атомики могут использовать активное ожидание (spin) на коротких операциях, что эффективно при низкой конкуренции. Мьютекс же при блокировке отдает управление ОС, что избыточно для простых счётчиков или флагов.
  3. Кэш-когерентность: Атомики работают напрямую с кэшем процессора (через протокол MESI), минимизируя задержки. Мьютекс требует дополнительных операций с очередями ожидания и системными вызовами.

Пример: счётчик запросов. С мьютексом:

GO
var mu sync.Mutex
var counter int
mu.Lock()
counter++
mu.Unlock()

С атомиком:

GO
var counter int64
atomic.AddInt64(&counter, 1)

Второй вариант в 10-50 раз быстрее на малой нагрузке, так как нет блокировок и переключений контекста.

Однако атомики применимы только для простых операций (счётчики, флаги, CAS). Для сложной логики (например, обновление нескольких полей структуры) нужен мьютекс, так как атомики не обеспечивают составной атомарности без дополнительных ухищрений (например, через atomic.Value).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью