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не даёт согласованного снимка
Проверьте себя
Какая структура реализует sync.Map начиная с Go 1.24?
Какой вариант по умолчанию для конкурентной карты?
В чём цена sync.Map при частых записях?
правильных ответов
sync.Map — специализированный инструмент: write-once-read-many и разрозненные ключи; выигрыш — от оптимистичного чтения без блокировок. По умолчанию документация рекомендует map с блокировкой; выбор подтверждать бенчмарком.
10 000 ₽ · 60 минут · онлайн