Sobes.tech
Junior — Middle

Biztosítani lehet-e a biztonságot egy Map-ból történő adatok egyidejű olvasásakor több szálas környezetben?

sobes.tech MI

Válasz az MI-től

Go-ban a standard map (térkép) nem biztonságos a párhuzamos hozzáféréshez. Ha több goroutine olvas a mapből írás nélkül, az biztonságos. Azonban, ha legalább egy goroutine ír a mapbe, a párhuzamos olvasás és írás pánikot okoz.

A map biztonságos párhuzamos olvasásához írás nélkül használhatunk egy normál mapet szinkronizáció nélkül. De ha van írási lehetőség, akkor szinkronizációt kell alkalmazni, például sync.RWMutex vagy sync.Map segítségével, amely kifejezetten a konkurens hozzáférésre lett tervezve.

Példa sync.RWMutex-szel a biztonságos olvasásra és írásra:

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

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

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

Ha garantálod, hogy a map a inicializálás után nem változik, akkor a párhuzamos olvasás biztonságos további szinkronizáció nélkül.