Go Academy · Lektion

Das Go-Speichermodell und Happens-Before

Garantien für Synchronisierung und Speicherreihenfolge

Lektion 2 von 413 Schritte

Das Go-Speichermodell und Happens-Before ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist das Speichermodell?

Das Speichermodell von Go legt fest, wann Schreibvorgänge einer Goroutine garantiert für Lesevorgänge einer anderen sichtbar sind. Ohne diese Garantien können nebenläufige Programme veraltete oder inkonsistente Werte beobachten.

Happens-before

Eine Happens-before-Beziehung garantiert, dass alle Schreibvorgänge vor Ereignis A bei Ereignis B sichtbar sind. Wenn keine Happens-before-Beziehung besteht, können Lesevorgänge beliebige Schreibvorgänge beobachten — auch den Nullwert.

Garantiertes Happens-before: Start einer Goroutine

Alles, was vor einer go-Anweisung geschieht, geschieht vor dem Beginn der Goroutine-Funktion. Die gestartete Goroutine sieht alle Schreibvorgänge, die vor ihrer Erstellung erfolgt sind.

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

Garantiert: Channel-Senden und -Empfangen

Ein Senden über einen Channel geschieht vor dem entsprechenden Empfang. Das Schließen geschieht vor einem Empfang des Nullwerts. Dies sind die primären Synchronisationsprimitive.

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

Garantiert: sync.Mutex

Das n-te Unlock eines Mutex geschieht vor dem (n+1)-ten Lock. Dadurch sieht eine Goroutine, die nach einem Unlock lockt, alle Schreibvorgänge, die vor dem Unlock erfolgt sind.

Garantiert: sync.Once

Der Abschluss der Funktion once.Do geschieht vor der Rückkehr jedes Aufrufs von once.Do. Alle Goroutines, die once.Do aufrufen, sehen die Initialisierung.

Garantiert: Channel-Schließen

Das Schließen eines Channels geschieht vor einem Empfang, der den Nullwert aus dem geschlossenen Channel zurückgibt. So sendet ein Done-Channel ein Signal an viele Goroutines.

Kein Happens-before: ungeschützte gemeinsam genutzte Variablen

Wenn zwei Goroutines ohne Synchronisation auf eine Variable zugreifen und mindestens eine davon schreibt, ist das Verhalten undefiniert. Der Race Detector erkennt dies.

Atomare Operationen

Das atomic-Paket stellt sequentiell konsistente Operationen bereit. Ein atomarer Store geschieht vor einem atomaren Load derselben Variablen in jeder Goroutine, die den gespeicherten Wert beobachtet.

Speichermodell für Channels

Bei gepufferten Channels mit der Kapazität C geschieht der k-te Empfang, bevor das (k+C)-te Senden abgeschlossen ist. So wird die begrenzte Pufferkapazität modelliert, die Backpressure garantiert.

Praktische Regel

Wenn Sie Daten zwischen Goroutines gemeinsam nutzen, übertragen Sie den Besitz über Channels oder schützen Sie Lese- und Schreibvorgänge mit Mutexes oder Atomics. Verlassen Sie sich ohne Synchronisation nicht auf Ihr intuitives Verständnis der Reihenfolge.

Schnelltest

Welche der folgenden Aktionen erzeugt eine Happens-before-Beziehung zwischen Goroutines?

Zusammenfassung: Go-Speichermodell

Wichtige Punkte:

  • Happens-before legt fest, wann Schreibvorgänge zwischen Goroutines sichtbar sind
  • Channels, Mutex, Once und der Start einer Goroutine erzeugen HB-Kanten
  • Unsynchronisierte Zugriffe auf gemeinsam genutzten veränderlichen Zustand sind undefiniert
  • Verwenden Sie den Race Detector, um Verstöße zu erkennen
Kostenlos starten

Lerne Go mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
51
Lektionen
203

Häufig gestellte Fragen

Ist die Lektion „Das Go-Speichermodell und Happens-Before“ kostenlos?

Ja — der vollständige Text von „Das Go-Speichermodell und Happens-Before“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Das Go-Speichermodell und Happens-Before“?

Garantien für Synchronisierung und Speicherreihenfolge Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Go Academy zu starten?

Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Das Go-Speichermodell und Happens-Before“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?

Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Stack und Heap sowie Escape-Analyse
  2. Das Go-Speichermodell und Happens-Before
  3. Interna des Garbage Collectors
  4. Allokationen reduzieren: sync.Pool und Arenen
← Zurück zu Go Academy