Материал проходит вычитку — возможны неточности.
Урок 97 из 118

Атомарность ≠ видимость

На разборе всплыл флаг «обработка завершена»: воркер прочитал устаревшее значение, хотя запись случилась давно. Аня показала на примере, как запись в обычную переменную не дошла до другой горутины. После правки флаг на атомике сразу отдавал свежее значение.

Главная мысль

атомарная операция даёт сразу две гарантии — неделимость (не увидишь «половину» записи) и видимость (это точка синхронизации, как Unlock для последующего Lock).

Что значит «неделимо»

var counter atomic.Int64

func inc() {
    counter.Add(1) // прочитал-прибавил-записал как одна операция
}

Обычный n++ — три шага, и две горутины теряют инкременты. atomic.Add выполняет всё как одно неделимое действие: сколько бы горутин ни добавляли, ни одно прибавление не потеряется.

Видимость

Видимость — про то, заметит ли запись, сделанную в одной горутине, другая. Без синхронизации компилятор и процессор вправе переупорядочивать операции и держать значения в регистрах, поэтому горутина способна подолгу не видеть чужих записей — или не увидеть их никогда. Атомик даёт обе гарантии сразу: операция sync/atomic — точка синхронизации, устанавливающая happens-before, как Unlock для последующего Lock.

Типизированные атомики

С Go 1.19 у атомиков появились типизированные обёртки:

Go

Раньше писали atomic.AddInt64(&counter, 1) с отдельными переменными — легко перепутать тип. Теперь atomic.Int64, atomic.Bool, atomic.Pointer[T] хранят значение внутри и проверяют типы на компиляции.

В следующем уроке

Вы узнаете:

  • как последовательная согласованность работает у атомиков
  • какие есть типизированные обёртки атомиков
Задание · вопросы

Проверьте себя

Вопрос 1 из 2

Рядом с атомиком лежит обычная переменная, читаемая в обход синхронизации. Что скажет -race?

Вопрос 2 из 2

Что даёт atomic.Store/Load?

Итоги

Атомик = неделимость + happens-before. Это и защита от гонки, и способ публикации значения между горутинами. Для одиночных значений — дешевле мьютекса.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки