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

sync.Map †

Кэш конфигурации конвейера записали один раз при старте, а читали его все воркеры на каждом запросе. Миша опробовал для него специальную конкурентную карту, но замеры показали: выигрыш узкий. В проде осталась обычная карта с замком.

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

sync.Map — потокобезопасная карта для двух узких сценариев: «записали один раз, читают много» и «разные горутины работают с разными ключами»; в остальных случаях документация рекомендует обычную map с блокировкой, а выбор подтверждать бенчмарком.

API

var m sync.Map

m.Store("key", "value")
v, ok := m.Load("key")
m.Delete("key")
m.Range(func(k, v any) bool {
    return true // false — остановить обход
})

Интерфейс непохож на обычную карту: Store/Load/Delete/Range вместо [], типы — any (теряется типобезопасность). Это первая цена: никакого map[K]V, только any.

Сценарий «write once, read many»

Классика — кэш конфигурации конвейера: загрузили один раз на старте, дальше только чтение из многих горутин. Заметь: чистое конкурентное чтение обычной map и так безопасно без блокировок — в этом сценарии справится и обычная map. Настоящее преимущество sync.Map — оптимистичное чтение: чтения не берут блокировку и не мешают друг другу даже тогда, когда параллельно идут записи в другие ключи.

Когда sync.Map не нужна

Документация самого пакета честна: для большинства случаев подходит обычная карта с блокировкой — она типобезопасна и даёт полный контроль над инвариантами, в том числе при частых обновлениях одних и тех же ключей. Выигрыш или проигрыш sync.Map зависит от профиля нагрузки, поэтому выбор подтверждают бенчмарком. Плюс any-интерфейс размывает типы.

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

Вы узнаете:

  • как бенчмарк сравнивает sync.Map и map+RWMutex
  • почему Range не даёт согласованного снимка
Задание · вопросы

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

Вопрос 1 из 3

Какая структура реализует sync.Map начиная с Go 1.24?

Вопрос 2 из 3

Какой вариант по умолчанию для конкурентной карты?

Вопрос 3 из 3

В чём цена sync.Map при частых записях?

Итоги

sync.Map — специализированный инструмент: write-once-read-many и разрозненные ключи; выигрыш — от оптимистичного чтения без блокировок. По умолчанию документация рекомендует map с блокировкой; выбор подтверждать бенчмарком.

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