Sobes.tech
Junior — Middle

¿Es posible garantizar la seguridad al leer datos de Map simultáneamente en un entorno multihilo?

sobes.tech AI

Respuesta de la IA

En Go, el mapa estándar (map) no es seguro para acceso concurrente. Si varios goroutines leen del mapa sin escribir, eso es seguro. Sin embargo, si al menos un goroutine escribe en el mapa, la lectura y escritura concurrentes provocarán un pánico.

Para leer del mapa de forma segura sin escribir, se puede usar un mapa normal sin sincronización. Pero si hay posibilidad de escritura, se debe usar sincronización, por ejemplo, mediante sync.RWMutex o usando sync.Map, que está diseñado específicamente para acceso concurrente.

Ejemplo con sync.RWMutex para lectura y escritura seguros:

var (
    m = make(map[string]int)
    mu sync.RWMutex
)

// Escritura
func write(key string, value int) {
    mu.Lock()
    defer mu.Unlock()
    m[key] = value
}

// Lectura
func read(key string) (int, bool) {
    mu.RLock()
    defer mu.RUnlock()
    val, ok := m[key]
    return val, ok
}

Si garantizas que el mapa no cambia después de la inicialización, entonces la lectura concurrente es segura sin sincronización adicional.