Для чего нужен пакет atomic в Go и когда его использовать вместо мьютекса
Что проверяют
Понимаете ли вы границу: атомарная операция защищает одно значение, а мьютекс защищает инвариант из нескольких переменных. Следом часто просят написать CAS-цикл или объяснить, почему два атомарных поля ещё не дают согласованного состояния.
Как отвечать
Пакет sync/atomic даёт неделимые операции над одним значением, которые выполняются инструкциями процессора, без блокировки горутины:
- базовые функции:
AddInt64,LoadInt64,StoreInt64,SwapInt64,CompareAndSwapInt64и аналоги для других типов; - типизированные обёртки: с Go 1.19 есть
atomic.Int64,atomic.Bool,atomic.Pointer[T]и другие. Их стоит предпочитать: поле нельзя случайно прочитать в обход атомика, а 64-битное значение выравнивается само, что раньше ломало код на 32-битных платформах; atomic.Valueиatomic.Pointer[T]: подмена целого объекта, например конфигурации, которую часто читают и редко обновляют. Новую версию собирают отдельно и публикуют однимStore;- модель памяти: с Go 1.19 атомарные операции официально последовательно согласованы, поэтому после
Loadвидно не только само значение, но и всё, что было записано до соответствующегоStore.
Когда брать atomic: счётчики и метрики, флаги вроде «сервис закрывается», публикация неизменяемых данных. Когда мьютекс: нужно изменить несколько полей согласованно, проверить условие и действовать по нему, работать с map или слайсом. Про скорость говорите аккуратно: Lock без конкуренции сам реализован через CAS и стоит недорого, выигрыш атомиков заметен при высокой конкуренции, когда горутины на мьютексе начали бы парковаться.
Где спотыкаются
Делают два поля атомарными и считают структуру потокобезопасной. Между чтением первого и второго поля другая горутина успеет изменить оба, и вы увидите комбинацию, которой никогда не существовало.
Смешивают атомарный и обычный доступ к одной переменной: пишут через atomic.AddInt64, а читают просто как x. Это гонка данных, и go test -race поймает её, если тест дойдёт до конкурентного доступа.
Строят на CAS сложную логику из нескольких шагов. Её трудно доказать и отладить, мьютекс там честнее.