Атомарность ≠ видимость
На разборе всплыл флаг «обработка завершена»: воркер прочитал устаревшее значение, хотя запись случилась давно. Аня показала на примере, как запись в обычную переменную не дошла до другой горутины. После правки флаг на атомике сразу отдавал свежее значение.
атомарная операция даёт сразу две гарантии — неделимость (не увидишь «половину» записи) и видимость (это точка синхронизации, как Unlock для последующего Lock).
Что значит «неделимо»
var counter atomic.Int64
func inc() {
counter.Add(1) // прочитал-прибавил-записал как одна операция
}
Обычный n++ — три шага, и две горутины теряют инкременты. atomic.Add выполняет всё как одно неделимое действие: сколько бы горутин ни добавляли, ни одно прибавление не потеряется.
Видимость
Видимость — про то, заметит ли запись, сделанную в одной горутине, другая. Без синхронизации компилятор и процессор вправе переупорядочивать операции и держать значения в регистрах, поэтому горутина способна подолгу не видеть чужих записей — или не увидеть их никогда. Атомик даёт обе гарантии сразу: операция sync/atomic — точка синхронизации, устанавливающая happens-before, как Unlock для последующего Lock.
Типизированные атомики
С Go 1.19 у атомиков появились типизированные обёртки:
Что здесь показано
- Стек — локальные переменные функции.
i = 3— значение;p = ptr → 10— указатель на значение;b = "hello"— срез (заголовок: указатель + длина + ёмкость). - Куча — данные, на которые ссылаются переменные:
rodata— байты строки-литерала (в бинарнике),данные N Б— бэкинг-массив слайса,строка— динамическая строка. - Горутины — лёгкие потоки Go: статус (running/runnable/waiting…), функция, в которой каждая сейчас находится, размер стека (растёт по мере работы) и пометка «из main» — горутина запущена из твоего кода.
- GC — сборщик мусора: фаза (off/mark) и число завершённых циклов.
Раньше писали atomic.AddInt64(&counter, 1) с отдельными переменными — легко перепутать тип. Теперь atomic.Int64, atomic.Bool, atomic.Pointer[T] хранят значение внутри и проверяют типы на компиляции.
Вы узнаете:
- как последовательная согласованность работает у атомиков
- какие есть типизированные обёртки атомиков
Проверьте себя
Рядом с атомиком лежит обычная переменная, читаемая в обход синхронизации. Что скажет -race?
Что даёт atomic.Store/Load?
правильных ответов
Атомик = неделимость + happens-before. Это и защита от гонки, и способ публикации значения между горутинами. Для одиночных значений — дешевле мьютекса.
10 000 ₽ · 60 минут · онлайн