Sobes.tech
Junior — Middle

Quelles mesures sont prises pour prévenir l'apparition de l'exception ConcurrentModificationException lors de la modification simultanée d'un objet Map par plusieurs threads?

sobes.tech IA

Réponse de l'IA

En Go, une carte (map) n’est pas sûre pour la concurrence pour la lecture et l’écriture simultanées depuis plusieurs goroutines. Pour éviter ConcurrentModificationException (l’équivalent en Go est une panique lors d’un accès concurrent), on applique les mesures suivantes:

  • Utilisation d’un mutex (sync.Mutex ou sync.RWMutex) pour synchroniser l’accès à la map.
  • Utilisation de structures de données sûres pour la concurrence, par exemple, sync.Map, qui est conçue spécifiquement pour un accès concurrent.

Exemple avec 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
}

Utilisation de 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
}

Ainsi, pour éviter les erreurs lors d’un accès concurrent à une map, il faut utiliser la synchronisation ou des structures spécialisées.