> Можно ли использовать map одновременно из нескольких горутин без синхронизации (Go)

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

Компании: Ozon

Стек: Go

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

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

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

  • sync.Mutex или sync.RWMutex - блокировка перед чтением/записью.

  • sync.Map - специальная конкурентная map, оптимизированная для сценариев, где ключи пишутся один раз и часто читаются, либо когда ключи не пересекаются между горутинами.

  • Каналы - передача запросов на изменение map в одну выделенную горутину (акторная модель).

Пример с sync.Mutex:

GO
var mu sync.Mutex
m := make(map[string]int)
// В горутине 1
mu.Lock()
m["key"] = 42
mu.Unlock()
// В горутине 2
mu.Lock()
val := m["key"]
mu.Unlock()

Игнорирование синхронизации - частая ошибка, которую выявляет go run -race.

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

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