Sobes.tech
Junior — Middle

Czy można bezpiecznie używać wspólnych zasobów typu Map przy jednoczesnym dostępie z wielu goroutine?

sobes.tech AI

Odpowiedź od AI

Nie, standardowa mapa w Go nie jest bezpieczna dla operacji równoczesnych i nie może być używana jednocześnie z wielu gorutyn bez dodatkowej synchronizacji. Równoczesny dostęp bez ochrony może prowadzić do wyścigów danych i panik.

Aby bezpiecznie korzystać z zasobów współdzielonych typu map w środowisku wielowątkowym, można:

  • Używać sync.Mutex lub sync.RWMutex do ochrony dostępu do mapy.
  • Używać sync.Map — specjalizowanej, bezpiecznej dla wątków struktury danych dla map.

Przykład z mutex:

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]
}

Użycie sync.Map:

var m sync.Map

m.Store("key", 42)
value, ok := m.Load("key")