Sobes.tech
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.Mutex vai sync.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.