Устранение гонки при одновремённом доступе к map

Все обращения к общей map нужно согласовать одним mutex либо передать владение map одной горутине. Защищать только запись недостаточно.

Короткий ответ

Что ответить на собеседовании

Все обращения к общей map нужно согласовать одним mutex либо передать владение map одной горутине. Защищать только запись недостаточно.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо избавиться от состояния гонки, которое возникает, когда несколько горутин одновременно читают и пишут в структуру map.

Устранить состояние гонки при одновременном чтении и записи в map из разных горутин.

Ответ

Все обращения к общей map нужно согласовать одним mutex либо передать владение map одной горутине. Защищать только запись недостаточно.

Пример обёртки с блокировкой на весь доступ:

import "sync"

type Store struct {
    mu sync.RWMutex
    data map[string]int
}

func (s *Store) Set(key string, value int) {
    s.mu.Lock()
    defer s.mu.Unlock()
    if s.data == nil { s.data = make(map[string]int) }
    s.data[key] = value
}

func (s *Store) Get(key string) (int, bool) {
    s.mu.RLock()
    defer s.mu.RUnlock()
    value, ok := s.data[key]
    return value, ok
}

Store нельзя копировать после начала использования. Операция «прочитать, изменить, записать» должна выполняться под одной эксклюзивной блокировкой; два отдельных безопасных метода не делают её атомарной.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее