Senior
Que problemas de acesso concorrente surgem ao chamar os métodos Get e Set de diferentes goroutines? Como resolvê-los?
sobes.tech IA
Resposta da IA
Quando métodos Get e Set são chamados simultaneamente de diferentes goroutines, surge um problema de corrida de dados (data race). Isso acontece porque várias goroutines podem ler e modificar dados compartilhados ao mesmo tempo, levando a comportamentos imprevisíveis e erros.
Para resolver esse problema em Go, geralmente usam-se:
- Mutex (sync.Mutex) — bloqueia o acesso aos dados durante a operação, garantindo acesso exclusivo.
- RWMutex (sync.RWMutex) — permite que várias goroutines leiam os dados simultaneamente, mas bloqueia a escrita se alguém estiver escrevendo.
- Canais (channels) — para organizar o acesso sequencial aos dados através do envio de mensagens.
Exemplo 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() // bloqueio para leitura
defer m.mu.RUnlock()
val, ok := m.data[key]
return val, ok
}
func (m *SafeMap) Set(key, value string) {
m.mu.Lock() // bloqueio para escrita
defer m.mu.Unlock()
m.data[key] = value
}
Este método garante que os dados não serão corrompidos durante o acesso concorrente.