Sobes.tech
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.