> Являются ли мапы в Go потокобезопасными (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: ЦУМ, InDrive

Стек: Go

> Пример ответа

Нет, встроенные мапы (map) в Go не являются потокобезопасными. Одновременное чтение и запись в одну и ту же мапу из разных горутин (goroutine) приводит к data race (гонке данных) и может вызвать панику с сообщением fatal error: concurrent map writes или concurrent map read and map write.

Пример опасного кода:

GO
m := make(map[int]int)
go func() {
for {
m[1] = 1 // запись
}
}()
go func() {
for {
_ = m[1] // чтение
}
}()
// Будет паника или неопределённое поведение

Для безопасного конкурентного доступа используйте:

  1. sync.Mutex или sync.RWMutex - оборачивайте операции с мапой в блокировки.

  2. sync.Map - встроенная потокобезопасная мапа, оптимизированная для сценариев с частым чтением и редкой записью, а также для кэширования.

Пример с sync.Mutex:

GO
type SafeMap struct {
mu sync.Mutex
m map[int]int
}
func (s *SafeMap) Set(key, val int) {
s.mu.Lock()
defer s.mu.Unlock()
s.m[key] = val
}

Используйте sync.Map, когда ключи стабильны, а операции чтения значительно преобладают над записью. В остальных случаях предпочтительнее явная синхронизация через мьютексы.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью