Junior — Middle
Kokias priemones imasi siekiant užkirsti kelią ConcurrentModificationException išimtims, kai keli srautai vienu metu keičia Map objektą?
sobes.tech AI
Atsakymas iš AI
Go kalboje žemėlapis (map) nėra saugus vienu metu skaityti ir rašyti iš kelių gorutinių. Norint išvengti ConcurrentModificationException (jo ekvivalentas Go kalboje — panika dėl vienalaikio prieigos), taikomi šie veiksmai:
- Naudoti mutexą (
sync.Mutexarbasync.RWMutex) siekiant sinchronizuoti prieigą prie žemėlapio. - Naudoti saugias konkurencijai struktūras, pavyzdžiui,
sync.Map, kurios specialiai sukurtos konkurenciniam prieigai.
Pavyzdys su mutex:
var mu sync.RWMutex
var m = make(map[string]int)
func read(key string) int {
mu.RLock()
defer mu.RUnlock()
return m[key]
}
func write(key string, value int) {
mu.Lock()
defer mu.Unlock()
m[key] = value
}
Naudojant sync.Map:
var m sync.Map
func write(key string, value int) {
m.Store(key, value)
}
func read(key string) (int, bool) {
val, ok := m.Load(key)
if !ok {
return 0, false
}
return val.(int), true
}
Taip, siekiant išvengti klaidų, kai keli gorutinai vienu metu pasiekia žemėlapį, būtina naudoti sinchronizaciją arba specializuotas struktūras.