Junior — Middle
Este posibil să asigurați securitatea în timpul citirii datelor dintr-un Map într-un mediu multi-threaded?
sobes.tech AI
Răspuns de la AI
În Go, harta standard (map) nu este sigură pentru accesul concurent. Dacă mai multe goroutine citesc din map fără a scrie, acest lucru este sigur. Cu toate acestea, dacă cel puțin o goroutine scrie în map, citirea și scrierea simultană vor duce la panic.
Pentru citirea sigură din map fără scriere, poți folosi o mapă obișnuită fără sincronizare. Dar dacă există posibilitatea de scriere, trebuie să folosești sincronizare, de exemplu, prin sync.RWMutex sau folosind sync.Map, care este special conceput pentru acces concurent.
Exemplu cu sync.RWMutex pentru citire și scriere sigură:
var (
m = make(map[string]int)
mu sync.RWMutex
)
// Scriere
func write(key string, value int) {
mu.Lock()
defer mu.Unlock()
m[key] = value
}
// Citire
func read(key string) (int, bool) {
mu.RLock()
defer mu.RUnlock()
val, ok := m[key]
return val, ok
}
Dacă garantati că mapa nu se schimbă după inițializare, citirea simultană este sigură fără sincronizare suplimentară.