Sobes.tech
Junior — Middle

Ce măsuri sunt luate pentru a preveni apariția excepției ConcurrentModificationException în timpul modificării simultane a unui obiect Map de către mai multe fire?

sobes.tech AI

Răspuns de la AI

În Go, un map (hartă) nu este sigur pentru accesul concurent pentru citire și scriere simultană din mai multe goroutines. Pentru a evita ConcurrentModificationException (echivalentul în Go fiind panic-ul la accesul concurent), se aplică următoarele măsuri:

  • Utilizarea unui mutex (sync.Mutex sau sync.RWMutex) pentru sincronizarea accesului la map.
  • Utilizarea structurilor de date sigure pentru concurență, de exemplu, sync.Map, care sunt special concepute pentru accesul concurent.

Exemplu cu 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
}

Utilizarea 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
}

Astfel, pentru a preveni erorile la accesul concurent la map, trebuie să folosiți sincronizare sau structuri specializate.