Junior — Middle
É possível garantir a segurança ao ler dados de um Map em um ambiente multithread?
sobes.tech IA
Resposta da IA
No Go, o mapa padrão (map) não é seguro para acesso concorrente. Se várias goroutines leem do mapa sem escrever, isso é seguro. No entanto, se pelo menos uma goroutine escreve no mapa, leitura e escrita simultâneas levarão a um pânico.
Para leitura segura do mapa sem escrita, pode usar um mapa normal sem sincronização. Mas se houver possibilidade de escrita, deve usar sincronização, por exemplo, através de sync.RWMutex ou usando sync.Map, que foi projetado especificamente para acesso concorrente.
Exemplo com sync.RWMutex para leitura e escrita seguras:
var (
m = make(map[string]int)
mu sync.RWMutex
)
// Escrita
func write(key string, value int) {
mu.Lock()
defer mu.Unlock()
m[key] = value
}
// Leitura
func read(key string) (int, bool) {
mu.RLock()
defer mu.RUnlock()
val, ok := m[key]
return val, ok
}
Se garantir que o mapa não muda após a inicialização, então a leitura simultânea é segura sem sincronização adicional.