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.