Вопрос проверяет понимание особенностей sync.Map в Go и её отличий от обычной map с мьютексом, что важно для выбора правильного инструмента синхронизации в конкурентных программах.
В Go обычная map не является потокобезопасной. Для конкурентного доступа разработчики часто используют map в паре с sync.Mutex или sync.RWMutex. sync.Map — это специальная структура, оптимизированная для определённых паттернов использования, таких как кэширование или счётчики.
sync.Map использует два внутренних хранилища: одно для чтения (read-only) и другое для записи (dirty). Чтения выполняются без блокировки, если данные есть в read-only части. Записи и удаления требуют блокировки, но только для dirty части. Это позволяет снизить конкуренцию при частых чтениях.
// Использование sync.Map
var m sync.Map
m.Store("key", "value")
val, ok := m.Load("key")
// Использование map с mutex
type SafeMap struct {
mu sync.Mutex
m map[string]string
}
func (s *SafeMap) Store(key, value string) {
s.mu.Lock()
defer s.mu.Unlock()
s.m[key] = value
}Вывод: sync.Map не заменяет обычную map с mutex, а предоставляет оптимизированное решение для узкого круга задач. Используйте sync.Map только если профилирование показывает, что блокировки являются узким местом.