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