Go Academy · Lección

Modelo de memoria de Go y Happens-Before

Garantías de sincronización y ordenación de memoria

Lección 2 de 413 pasos

Modelo de memoria de Go y Happens-Before es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

¿Qué es el modelo de memoria?

El modelo de memoria de Go define cuándo se garantiza que las escrituras realizadas por una goroutine sean visibles para las lecturas realizadas por otra. Sin estas garantías, los programas concurrentes pueden observar valores obsoletos o incoherentes.

Relación happens-before

Una relación happens-before garantiza que todas las escrituras anteriores al evento A sean visibles en el evento B. Si no existe una relación happens-before, las lecturas pueden observar cualquier escritura, incluido el valor cero.

Happens-before garantizado: inicio de una goroutine

Todo lo que ocurre antes de una instrucción go ocurre antes de que comience la función de la goroutine. La goroutine creada ve todas las escrituras realizadas antes de su creación.

x := 10
go func() {
    fmt.Println(x) // guaranteed to see 10
}()

Garantizado: envío y recepción por canales

Un envío por un canal ocurre antes de la recepción correspondiente. Un cierre ocurre antes de una recepción del valor cero. Estos son los principales mecanismos de sincronización.

ch := make(chan int)
go func() { ch <- 42 }()   // send hb receive
v := <-ch
fmt.Println(v) // guaranteed to see 42

Garantizado: sync.Mutex

El n.º n Unlock de un mutex ocurre antes del n.º (n+1) Lock. Esto garantiza que una goroutine que bloquea después de un desbloqueo vea todas las escrituras realizadas antes de dicho desbloqueo.

Garantizado: sync.Once

La finalización de la función once.Do ocurre antes de que retorne cualquier llamada a once.Do. Todas las goroutines que llaman a once.Do ven la inicialización.

Garantizado: cierre de un canal

Cerrar un canal ocurre antes de una recepción que devuelve el valor cero del canal cerrado. Así es como un canal done envía una señal a varias goroutines.

Sin happens-before: variables compartidas sin protección

Si dos goroutines acceden a una variable sin sincronización y al menos una escribe en ella, el comportamiento es indefinido. El detector de carreras lo detecta.

Operaciones atómicas

El paquete atomic proporciona operaciones secuencialmente consistentes. Un almacenamiento atómico ocurre antes de una carga atómica de la misma variable en cualquier goroutine que observe el valor almacenado.

Modelo de memoria para canales

En los canales con búfer de capacidad C, la k-ésima recepción ocurre antes de que finalice el k+C-ésimo envío. Esto modela la capacidad limitada del búfer, que garantiza el backpressure.

Regla práctica

Si comparte datos entre goroutines, utilice canales para transferir la propiedad o utilice mutexes y operaciones atómicas para proteger las lecturas y escrituras. No se base en la intuición sobre el orden sin sincronización.

Comprobación rápida

¿Cuál de las siguientes opciones crea una relación happens-before entre goroutines?

Resumen: modelo de memoria de Go

Puntos clave:

  • Happens-before define cuándo las escrituras son visibles entre goroutines
  • Los canales, Mutex, Once y el inicio de una goroutine crean relaciones HB
  • El acceso sin sincronización a un estado mutable compartido tiene un comportamiento indefinido
  • Utilice el detector de carreras para detectar infracciones
Gratis para empezar

Aprende Go con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
51
Lecciones
203

Preguntas frecuentes

¿La lección «Modelo de memoria de Go y Happens-Before» es gratis?

Sí — el texto completo de «Modelo de memoria de Go y Happens-Before» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Modelo de memoria de Go y Happens-Before»?

Garantías de sincronización y ordenación de memoria Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Modelo de memoria de Go y Happens-Before»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Stack frente a heap y análisis de escape
  2. Modelo de memoria de Go y Happens-Before
  3. Internals del recolector de basura
  4. Reducción de asignaciones: sync.Pool y arenas
← Volver a Go Academy