Modelo de memória do Go e Happens-Before
Garantias de sincronização e ordenação de memória
Modelo de memória do Go e Happens-Before é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 2 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.
O que é o modelo de memória?
O modelo de memória do Go define quando as escritas em uma variável por uma rotina Go têm garantia de visibilidade para as leituras feitas por outra. Sem essas garantias, programas concorrentes podem observar valores desatualizados ou inconsistentes.
Relação de precedência
Uma relação de precedência garante que todas as escritas anteriores ao evento A estejam visíveis no evento B. Se não houver uma relação de precedência, as leituras poderão observar qualquer escrita — inclusive o valor zero.
Precedência garantida: início de uma rotina Go
Tudo o que acontece antes de uma instrução go acontece antes de a função da rotina começar. A rotina iniciada vê todas as escritas feitas antes de sua criação.
x := 10
go func() {
fmt.Println(x) // guaranteed to see 10
}()Garantia: envio e recebimento por canal
Um envio por canal acontece antes do recebimento correspondente. O fechamento acontece antes de um recebimento do valor zero. Essas são as principais primitivas de sincronização.
ch := make(chan int)
go func() { ch <- 42 }() // send hb receive
v := <-ch
fmt.Println(v) // guaranteed to see 42Garantia: sync.Mutex
O n-ésimo Unlock de um mutex acontece antes do (n+1)-ésimo Lock. Isso garante que uma rotina que adquire o mutex após um desbloqueio veja todas as escritas feitas antes desse desbloqueio.
Garantia: sync.Once
A conclusão da função once.Do acontece antes que qualquer chamada a once.Do retorne. Todas as rotinas que chamam once.Do veem a inicialização.
Garantia: fechamento de canal
O fechamento de um canal acontece antes de um recebimento que retorna o valor zero do canal fechado. É assim que um canal de conclusão transmite uma sinalização para várias rotinas.
Sem relação de precedência: variáveis compartilhadas desprotegidas
Se duas rotinas acessarem uma variável sem sincronização e pelo menos uma escrever nela, o comportamento será indefinido. O detector de condições de corrida identifica isso.
Operações atômicas
O pacote atomic fornece operações sequencialmente consistentes. Uma escrita atômica acontece antes de uma leitura atômica da mesma variável em qualquer rotina que observe o valor escrito.
Modelo de memória dos canais
Para canais com buffer de capacidade C, o k-ésimo recebimento acontece antes que o (k+C)-ésimo envio seja concluído. Isso representa a capacidade limitada do buffer, garantindo contrapressão.
Regra prática
Se compartilhar dados entre rotinas Go, use canais para transferir a posse ou use mutexes e operações atômicas para proteger leituras e escritas. Não dependa da intuição sobre a ordenação sem sincronização.
Verificação rápida
Qual das opções a seguir cria uma relação de precedência entre rotinas Go?
Recapitulação: modelo de memória do Go
Pontos principais:
- A relação de precedência define quando as escritas ficam visíveis entre rotinas Go
- Canais, Mutex, Once e o início de uma rotina Go criam relações de HB
- O acesso não sincronizado ao estado mutável compartilhado é indefinido
- Use o detector de condições de corrida para identificar violações
Perguntas Frequentes
A aula “Modelo de memória do Go e Happens-Before” é grátis?
Sim — o texto completo de “Modelo de memória do Go e Happens-Before” é 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 “Modelo de memória do Go e Happens-Before”?
Garantias de sincronização e ordenação de memória 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 2 de 4.
Quanto tempo leva a aula “Modelo de memória do Go e Happens-Before”?
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
- Stack versus heap e análise de escape
- Modelo de memória do Go e Happens-Before
- Internals do coletor de lixo
- Reduzindo alocações: sync.Pool e arenas