Sobes.tech
Назад к вопросам
Senior
7

Горутины пишут данные в общую мапу без синхронизации — почему это плохо и как это исправить?

Компании, где спрашивали
Spectr

Ответ от нейросети

sobes.tech AI

В Go мапы не являются потокобезопасными для записи из нескольких горутин одновременно. Если несколько горутин пишут в одну мапу без синхронизации, это приводит к гонкам данных, паникам и непредсказуемому поведению программы.

Чтобы исправить эту проблему, нужно обеспечить синхронизацию доступа к мапе. Основные способы:

  1. Использовать 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]
}
  1. Использовать 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
}

Таким образом, синхронизация предотвращает гонки и обеспечивает корректную работу программы.