Sobes.tech
Senior

¿Qué problemas de acceso concurrente surgen al llamar a los métodos Get y Set desde diferentes goroutines? ¿Cómo se resuelven?

sobes.tech AI

Respuesta de la IA

Cuando se llaman simultáneamente a los métodos Get y Set desde diferentes goroutines, surge un problema de carrera de datos (data race). Esto sucede porque varias goroutines pueden leer y modificar datos compartidos al mismo tiempo, lo que conduce a comportamientos impredecibles y errores.

Para resolver este problema en Go, generalmente se utilizan:

  • Mutex (sync.Mutex) — bloquean el acceso a los datos durante la operación, asegurando acceso exclusivo.
  • RWMutex (sync.RWMutex) — permite que varias goroutines lean datos simultáneamente, pero bloquea la escritura si alguien está escribiendo.
  • Canales (channels) — para organizar el acceso secuencial a los datos mediante el envío de mensajes.

Ejemplo usando RWMutex:

import "sync"

type SafeMap struct {
    mu sync.RWMutex
    data map[string]string
}

func (m *SafeMap) Get(key string) (string, bool) {
    m.mu.RLock()         // bloqueo para lectura
    defer m.mu.RUnlock()
    val, ok := m.data[key]
    return val, ok
}

func (m *SafeMap) Set(key, value string) {
    m.mu.Lock()          // bloqueo para escritura
    defer m.mu.Unlock()
    m.data[key] = value
}

Este enfoque garantiza que los datos no se dañen durante el acceso concurrente.