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.