sync.Mutex e sync.RWMutex
Padrões de bloqueio e de bloqueio para leitura e escrita
sync.Mutex e sync.RWMutex é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.
Por que usar exclusão mútua?
Quando várias gorrotinas compartilham um estado mutável, leituras e gravações simultâneas causam condições de corrida. Um mecanismo de exclusão mútua serializa o acesso, permitindo que apenas uma gorrotina entre na seção crítica por vez.
Noções básicas de sync.Mutex
Use Lock antes de ler ou gravar o estado compartilhado; use Unlock depois. Use defer para garantir a liberação do bloqueio mesmo que a função entre em pânico.
var mu sync.Mutex
var counter int
func inc() {
mu.Lock()
defer mu.Unlock()
counter++
}Incorporando a exclusão mútua em uma estrutura
Incorpore o mecanismo de exclusão mútua à estrutura que ele protege. Por convenção, o mecanismo é declarado logo acima dos campos que ele protege.
type SafeCounter struct {
mu sync.Mutex
v map[string]int
}
func (c *SafeCounter) Inc(key string) {
c.mu.Lock()
defer c.mu.Unlock()
c.v[key]++
}Não copie um mecanismo de exclusão mútua
Um mecanismo de exclusão mútua não deve ser copiado após o primeiro uso. Passe-o por ponteiro ou incorpore-o a uma estrutura passada por ponteiro. A ferramenta go vet detecta cópias.
sync.RWMutex
sync.RWMutex permite vários leitores simultâneos, mas apenas um escritor. Use-o quando as leituras predominarem e as gravações forem raras, para aumentar o rendimento.
var rw sync.RWMutex
var data map[string]int
func read(k string) int {
rw.RLock()
defer rw.RUnlock()
return data[k]
}
func write(k string, v int) {
rw.Lock()
defer rw.Unlock()
data[k] = v
}RLock versus Lock
RLock adquire um bloqueio de leitura (compartilhado); Lock adquire um bloqueio de gravação (exclusivo). Um bloqueio de gravação pendente impede novos bloqueios de leitura, evitando a inanição do escritor.
TryLock (Go 1.18+)
mu.TryLock() adquire o bloqueio somente se ele estiver desbloqueado no momento, retornando um booleano. É útil quando o bloqueio não é aceitável.
if mu.TryLock() {
defer mu.Unlock()
// critical section
}Interbloqueios
Um interbloqueio ocorre quando a gorrotina A mantém o bloqueio 1 enquanto aguarda o bloqueio 2, e a gorrotina B mantém o bloqueio 2 enquanto aguarda o bloqueio 1. Sempre adquira os bloqueios na mesma ordem e mantenha as seções críticas curtas.
Granularidade do bloqueio
Um bloqueio amplo é mais fácil de compreender, mas reduz a concorrência. O bloqueio refinado melhora o rendimento, mas aumenta a complexidade e o risco de interbloqueio. Comece com um bloqueio amplo e otimize se a análise de desempenho mostrar contenção.
Exclusão mútua versus canal
Use um mecanismo de exclusão mútua ao proteger um estado compartilhado com muitos leitores e escritores. Use um canal ao transferir a propriedade dos dados entre gorrotinas. Canais servem para comunicação; mecanismos de exclusão mútua, para sincronização.
Interface sync.Locker
sync.Locker é uma interface com Lock e Unlock. Tanto Mutex quanto RWMutex a implementam, permitindo que funções auxiliares aceitem qualquer um dos dois tipos.
Verificação rápida
Quando deve usar sync.RWMutex em vez de sync.Mutex?
Recapitulação: Mutex e RWMutex
Pontos-chave:
- Mutex serializa o acesso; use sempre defer Unlock
- Nunca copie um Mutex após o primeiro uso
- RWMutex: vários leitores OU um escritor
- Adquira os bloqueios sempre na mesma ordem para evitar interbloqueios
Perguntas Frequentes
A aula “sync.Mutex e sync.RWMutex” é grátis?
Sim — o texto completo de “sync.Mutex e sync.RWMutex” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.
O que vou aprender em “sync.Mutex e sync.RWMutex”?
Padrões de bloqueio e de bloqueio para leitura e escrita Você pratica Go Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Go Academy?
Nenhuma experiência prévia é necessária. Go Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “sync.Mutex e sync.RWMutex”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Go Academy?
Sim. Cada aula de Go Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- sync.Mutex e sync.RWMutex
- sync.WaitGroup
- sync.Once e sync.Map
- Detector de condições de corrida e padrões seguros