Junior — Middle
Kādas darbības tiek veiktas, lai novērstu izņēmuma ConcurrentModificationException rašanos, vienlaikus modificējot Map objektu no vairākiem pavedieniem?
sobes.tech AI
Atbilde no AI
Go valodā karte (map) nav droša vienlaicīgai lasīšanai un rakstīšanai no vairākām gorutīnām. Lai izvairītos no ConcurrentModificationException (Go ekvivalentā tas ir panika, ja ir vienlaicīga piekļuve), tiek piemēroti šādi pasākumi:
- Izmantot mutexu (
sync.Mutexvaisync.RWMutex), lai sinhronizētu piekļuvi kartei. - Izmantot drošas konkursa struktūras, piemēram,
sync.Map, kas ir īpaši izstrādāta konkurējošai piekļuvei.
Piemērs ar 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
}
Izmantojot 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
}
Lai novērstu kļūdas, vienlaicīgi piekļūstot kartei, ir nepieciešams izmantot sinhronizāciju vai specializētas struktūras.