Потокобезопасна ли Map

«Потокобезопасна ли Map» — вопрос из категории Golang, который задают на 29% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, стандартная map в Go не потокобезопасна. При одновременном чтении и записи в map из разных горутин может возникнуть состояние гонки (race condition), приводящее к неопределённому поведению или панике.

Для потокобезопасной работы с map можно использовать:

  1. sync.Mutex или sync.RWMutex для блокировок
  2. sync.Map (для высоконагруженных read-heavy сценариев)

Пример с sync.RWMutex:

type SafeMap struct {
    sync.RWMutex
    m map[string]int
}

func (s *SafeMap) Get(key string) int {
    s.RLock()
    defer s.RUnlock()
    return s.m[key]
}

func (s *SafeMap) Set(key string, val int) {
    s.Lock()
    defer s.Unlock()
    s.m[key] = val
}