Junior — Middle
¿Qué medidas se toman para prevenir la aparición de la excepción ConcurrentModificationException al modificar simultáneamente un objeto Map desde varios hilos?
sobes.tech AI
Respuesta de la IA
En Go, un mapa (map) no es seguro para la concurrencia para lectura y escritura simultáneas desde varias goroutines. Para evitar ConcurrentModificationException (el equivalente en Go es un pánico por acceso concurrente), se aplican las siguientes medidas:
- Uso de mutex (
sync.Mutexosync.RWMutex) para sincronizar el acceso al mapa. - Uso de estructuras de datos seguras para hilos, por ejemplo,
sync.Map, que está diseñada específicamente para acceso concurrente.
Ejemplo con 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
}
Uso 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
}
De esta manera, para evitar errores en accesos concurrentes a mapas, se debe usar sincronización o estructuras especializadas.