Sobes.tech
Junior — Middle

È sicuro usare risorse condivise come Map quando si accede contemporaneamente da più goroutine?

sobes.tech AI

Risposta dell'AI

No, la mappa standard in Go non è sicura per l'accesso concorrente e non può essere utilizzata contemporaneamente da più goroutine senza sincronizzazione aggiuntiva. L'accesso concorrente senza protezione può causare condizioni di gara e panico.

Per usare in modo sicuro risorse condivise come le mappe in ambienti multithread, si può:

  • Usare sync.Mutex o sync.RWMutex per proteggere l'accesso alla mappa.
  • Utilizzare sync.Map, una struttura dati specializzata e sicura per le mappe.

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

Utilizzo di sync.Map:

var m sync.Map

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