Sobes.tech
Junior — Middle

Jakie środki są podejmowane, aby zapobiec wystąpieniu wyjątku ConcurrentModificationException podczas jednoczesnej modyfikacji obiektu Map przez wiele wątków?

sobes.tech AI

Odpowiedź od AI

W Go, mapa (mapa) nie jest bezpieczna dla współbieżnego odczytu i zapisu z wielu gorutyn. Aby uniknąć ConcurrentModificationException (odpowiednik w Go to panika przy jednoczesnym dostępie), stosuje się następujące środki:

  • Użycie mutexa (sync.Mutex lub sync.RWMutex) do synchronizacji dostępu do mapy.
  • Użycie bezpiecznych dla wątków struktur danych, np. sync.Map, które są specjalnie zaprojektowane do współbieżnego dostępu.

Przykład z mutexem:

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
}

Użycie 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
}

W ten sposób, aby zapobiec błędom przy współbieżnym dostępie do mapy, należy używać synchronizacji lub specjalistycznych struktur.