> Можно ли использовать 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:
GOvar mu sync.Mutexm := make(map[string]int)// В горутине 1mu.Lock()m["key"] = 42mu.Unlock()// В горутине 2mu.Lock()val := m["key"]mu.Unlock()
Игнорирование синхронизации - частая ошибка, которую выявляет go run -race.
> Похожие задачи по backend
Почему вывод в цикле с горутинами в Go не гарантирован по порядку
В чем отличие планировщика Go от планировщика операционной системы
Что происходит при чтении из пустого буферизованного канала в Go и записи в него другой горутиной
Нужно ли использовать мьютексы для синхронизации при работе с каналами и горутинами в Go
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью