> Как использовать мьютексы для защиты мапы при параллельном доступе в Go (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Т-Банк
Стек: Go
> Пример ответа
В Go мьютекс (sync.Mutex) используется для защиты мапы от состояния гонки при параллельном доступе. Основная идея - блокировать доступ к мапе перед чтением или записью и разблокировать после завершения операции.
Пример реализации:
GOimport "sync"type SafeMap struct {mu sync.Mutexm map[string]int}func NewSafeMap() *SafeMap {return &SafeMap{m: make(map[string]int)}}func (s *SafeMap) Set(key string, value int) {s.mu.Lock()defer s.mu.Unlock()s.m[key] = value}func (s *SafeMap) Get(key string) (int, bool) {s.mu.Lock()defer s.mu.Unlock()val, ok := s.m[key]return val, ok}
Ключевые моменты:
- Используйте
Lock()перед изменением мапы иUnlock()после, либоdefer s.mu.Unlock()для гарантии освобождения. - Для операций только чтения можно использовать
RLock()/RUnlock()сsync.RWMutex, чтобы разрешить параллельное чтение, но блокировать запись. - Никогда не копируйте мьютекс после его использования - передавайте указатель на структуру.
- Если мапа используется в нескольких горутинах, всегда синхронизируйте доступ, иначе возникнет паника из-за конкурентной записи.
Для простых сценариев также подходит sync.Map, но она оптимизирована для специфических паттернов (редкие записи, частые чтения). В общем случае ручное управление с мьютексом даёт больше контроля и производительности.
> Похожие задачи по Go
Работали ли с системами сбора и хранения метрик, например Graphite, Jaeger, Prometheus
Как оптимизировать блокировки при работе с мапой и слайсом в Go, чтобы не блокировать весь слайс
Почему при эвакуации данных в мапе Go возникает проблема с конкурентным доступом и race condition
Какие типы записей существуют в DNS
> Похожие задачи по backend
Как оптимизировать блокировки при работе с мапой и слайсом в Go, чтобы не блокировать весь слайс
Какой максимальный размер строки на входе и нужно ли его обрабатывать
Почему при эвакуации данных в мапе Go возникает проблема с конкурентным доступом и race condition
Что такое замыкание?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью