0Pricing
Go Academy · Aula

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

  1. sync.Mutex e sync.RWMutex
  2. sync.WaitGroup
  3. sync.Once e sync.Map
  4. Detector de condições de corrida e padrões seguros
← Voltar para Go Academy