Что такое sync.Map?go-50

sync.Map — это concurrent-safe реализация ассоциативного массива (словаря) из пакета sync, предназначенная для использования в высококонкурентных сценариях.

Основные характеристики

  1. Потокобезопасность: Может использоваться из нескольких горутин без дополнительной синхронизации
  2. Оптимизация для read-heavy workload: Эффективна при частом чтении и редких записях
  3. Отсутствие блокировок при чтении: Чтение не блокирует другие операции чтения

Когда использовать sync.Map

Основные сценарии применения:

  • Когда есть много горутин, читающих и/или записывающих данные
  • Когда количество ключей стабильно или редко меняется
  • Когда нужна высокая производительность при конкурентном доступе

Основные методы

var m sync.Map

// Сохранение значения
m.Store("key", "value")

// Получение значения
value, ok := m.Load("key")

// Удаление
m.Delete("key")

// Атомарное обновление
m.LoadOrStore("key", "default") // Загружает или сохраняет

// Перебор элементов
m.Range(func(key, value interface{}) bool {
    fmt.Println(key, value)
    return true // false для прерывания
})

Преимущества перед map + mutex

  1. Лучшая производительность в высококонкурентных сценариях
  2. Отсутствие блокировок при чтении
  3. Оптимизированная работа с частыми чтениями и редкими записями

Недостатки

  1. Менее предсказуемая производительность при частых записях
  2. Нет типизации (использует interface{})
  3. Больший расход памяти по сравнению с обычной map

Пример использования

var userSessions sync.Map

func handleRequest(userID string) {
    // Атомарное создание сессии при необходимости
    session, _ := userSessions.LoadOrStore(userID, NewSession())

    // Использование сессии
    sess := session.(Session) // Приведение типа
    sess.DoSomething()

    // Периодическая очистка старых сессий
    userSessions.Range(func(key, value interface{}) bool {
        if value.(Session).Expired() {
            userSessions.Delete(key)
        }
        return true
    })
}

Внутренняя реализация

sync.Map использует:

  1. Две мапы (dirty и read): Для минимизации блокировок
  2. Атомарные операции: Для управления состоянием
  3. Механизм промоушена: При частых обновлениях

Сравнение с альтернативами

Характеристика sync.Map map + RWMutex concurrent-map
Блокировки чтения Нет RLock Нет
Производительность Высокая Средняя Высокая
Типизация Нет Да Да (генрики)
Стандартная либа Да Да Нет

Резюмируем

  1. Что такое sync.Map
    Потокобезопасная реализация словаря из стандартной библиотеки Go

  2. Когда использовать

    • Высококонкурентный доступ
    • Read-heavy workload
    • Редкие обновления
  3. Основные методы

    • Store/Load/Delete
    • LoadOrStore/Range
  4. Альтернативы

    • map + mutex для простых случаев
    • Сторонние concurrent-map реализации для типизированных решений

sync.Map — мощный инструмент для специфических сценариев, но не универсальная замена обычным map.