Is het mogelijk om veiligheid te garanderen bij het gelijktijdig lezen van gegevens uit een Map in een multithread-omgeving?
sobes.tech AI
Antwoord van AI
In Go is een standaardkaart (map) niet thread-safe voor gelijktijdige toegang. Als meerdere goroutines uit de map lezen zonder te schrijven, is dat veilig. Maar als minstens één goroutine in de map schrijft, zullen gelijktijdig lezen en schrijven tot een panic leiden.
Voor veilig gelijktijdig lezen uit de map zonder schrijven, kun je een gewone map zonder synchronisatie gebruiken. Maar als er een mogelijkheid tot schrijven is, moet je synchronisatie gebruiken, bijvoorbeeld via sync.RWMutex of sync.Map, dat speciaal is ontworpen voor gelijktijdige toegang.
Voorbeeld met sync.RWMutex voor veilige lezen en schrijven:
var (
m = make(map[string]int)
mu sync.RWMutex
)
// Schrijven
func write(key string, value int) {
mu.Lock()
defer mu.Unlock()
m[key] = value
}
// Lezen
func read(key string) (int, bool) {
mu.RLock()
defer mu.RUnlock()
val, ok := m[key]
return val, ok
}
Als je garandeert dat de map na initialisatie niet meer wordt gewijzigd, is gelijktijdig lezen veilig zonder extra synchronisatie.