Назад к вопросам
Senior
7
Горутины пишут данные в общую мапу без синхронизации — почему это плохо и как это исправить?
Компании, где спрашивали
Spectr
Ответ от нейросети
sobes.tech AI
В Go мапы не являются потокобезопасными для записи из нескольких горутин одновременно. Если несколько горутин пишут в одну мапу без синхронизации, это приводит к гонкам данных, паникам и непредсказуемому поведению программы.
Чтобы исправить эту проблему, нужно обеспечить синхронизацию доступа к мапе. Основные способы:
- Использовать mutex (sync.Mutex или sync.RWMutex) для блокировки мапы при записи и чтении:
var mu sync.Mutex
var m = make(map[string]int)
func write(key string, value int) {
mu.Lock()
m[key] = value
mu.Unlock()
}
func read(key string) int {
mu.Lock()
defer mu.Unlock()
return m[key]
}
- Использовать sync.Map — потокобезопасную реализацию мапы из стандартной библиотеки, которая оптимизирована для сценариев с большим количеством чтений и меньшим количеством записей:
var m sync.Map
func write(key string, value int) {
m.Store(key, value)
}
func read(key string) (int, bool) {
v, ok := m.Load(key)
if !ok {
return 0, false
}
return v.(int), true
}
Таким образом, синхронизация предотвращает гонки и обеспечивает корректную работу программы.