Sobes.tech
Junior — Middle

È possibile garantire la sicurezza durante la lettura simultanea dei dati da Map in un ambiente multithread?

sobes.tech AI

Risposta dell'AI

In Go, la mappa standard (map) non è sicura per l'accesso concorrente. Se più goroutine leggono dalla mappa senza scrivere, è sicuro. Tuttavia, se almeno una goroutine scrive nella mappa, leggere e scrivere contemporaneamente causerà un panic.

Per leggere in modo sicuro dalla mappa senza scrivere, puoi usare una mappa normale senza sincronizzazione. Ma se c'è possibilità di scrittura, devi usare sincronizzazione, ad esempio tramite sync.RWMutex o usando sync.Map, progettato appositamente per accessi concorrenti.

Esempio con sync.RWMutex per lettura e scrittura sicure:

var (
    m = make(map[string]int)
    mu sync.RWMutex
)

// Scrittura
func write(key string, value int) {
    mu.Lock()
    defer mu.Unlock()
    m[key] = value
}

// Lettura
func read(key string) (int, bool) {
    mu.RLock()
    defer mu.RUnlock()
    val, ok := m[key]
    return val, ok
}

Se garantisci che la mappa non cambia dopo l'inizializzazione, la lettura concorrente è sicura senza sincronizzazione aggiuntiva.