0Pricing
Go Academy · Lektion

sync.Mutex und sync.RWMutex

Sperr- sowie Lese-Schreib-Sperr-Patterns

sync.Mutex und sync.RWMutex ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 1 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.

Warum Mutexe?

Wenn mehrere Goroutinen einen veränderlichen Zustand gemeinsam nutzen, führen gleichzeitige Lese- und Schreibvorgänge zu Data Races. Ein Mutex serialisiert den Zugriff, sodass immer nur eine Goroutine den kritischen Abschnitt betritt.

Grundlagen von sync.Mutex

Sperren Sie den Zugriff, bevor Sie einen gemeinsam genutzten Zustand lesen oder schreiben, und heben Sie die Sperre danach auf. Verwenden Sie defer, um das Entsperren auch dann zu garantieren, wenn die Funktion einen Panic auslöst.

var mu sync.Mutex
var counter int

func inc() {
    mu.Lock()
    defer mu.Unlock()
    counter++
}

Mutex in eine Struktur einbetten

Betten Sie den Mutex in die Struktur ein, die er schützt. Üblicherweise wird der Mutex direkt über den Feldern deklariert, die er schützt.

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]++
}

Einen Mutex nicht kopieren

Ein Mutex darf nach seiner ersten Verwendung nicht kopiert werden. Übergeben Sie ihn als Pointer oder betten Sie ihn in eine Struktur ein, die als Pointer übergeben wird. Das Tool go vet erkennt Kopien.

sync.RWMutex

sync.RWMutex erlaubt mehrere gleichzeitige Leser, aber nur einen Schreiber. Verwenden Sie ihn, wenn Lesevorgänge überwiegen und Schreibvorgänge selten sind, um den Durchsatz zu erhöhen.

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 im Vergleich zu Lock

RLock erwirbt eine Lesesperre (gemeinsam), Lock eine Schreibsperre (exklusiv). Eine ausstehende Schreibsperre blockiert neue Lesesperren und verhindert so, dass Schreiber verhungern.

TryLock (Go 1.18+)

mu.TryLock() erwirbt die Sperre nur, wenn sie derzeit nicht gesperrt ist, und gibt einen booleschen Wert zurück. Dies ist nützlich, wenn Blockieren nicht akzeptabel ist.

if mu.TryLock() {
    defer mu.Unlock()
    // critical section
}

Deadlocks

Ein Deadlock tritt auf, wenn Goroutine A Sperre 1 hält und auf Sperre 2 wartet, während Goroutine B Sperre 2 hält und auf Sperre 1 wartet. Erwerben Sie Sperren immer in derselben Reihenfolge und halten Sie kritische Abschnitte kurz.

Granularität von Sperren

Eine grobkörnige Sperre ist leichter zu verstehen, verringert aber die Nebenläufigkeit. Feingranulare Sperren erhöhen den Durchsatz, steigern jedoch die Komplexität und das Deadlock-Risiko. Beginnen Sie grobkörnig und optimieren Sie nur, wenn das Profiling eine hohe Konkurrenz um Sperren zeigt.

Mutex im Vergleich zu Kanal

Verwenden Sie einen Mutex, wenn Sie gemeinsam genutzten Zustand mit vielen Lesern und Schreibern schützen. Verwenden Sie einen Kanal, wenn Sie den Besitz von Daten zwischen Goroutinen übertragen. Kanäle dienen der Kommunikation, Mutexes der Synchronisierung.

Schnittstelle sync.Locker

sync.Locker ist eine Schnittstelle mit Lock und Unlock. Sowohl Mutex als auch RWMutex implementieren sie, sodass Hilfsfunktionen beide Typen akzeptieren können.

Schnelltest

Wann sollten Sie sync.RWMutex statt sync.Mutex verwenden?

Zusammenfassung: Mutex und RWMutex

Wichtige Punkte:

  • Mutex serialisiert Zugriffe; rufen Sie Unlock immer über defer auf
  • Kopieren Sie einen Mutex nach seiner ersten Verwendung niemals
  • RWMutex: mehrere Leser ODER ein Schreiber
  • Erwerben Sie Sperren immer in derselben Reihenfolge, um Deadlocks zu vermeiden

Häufig gestellte Fragen

Ist die Lektion „sync.Mutex und sync.RWMutex“ kostenlos?

Ja — der vollständige Text von „sync.Mutex und sync.RWMutex“ 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 „sync.Mutex und sync.RWMutex“?

Sperr- sowie Lese-Schreib-Sperr-Patterns 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 1 von 4.

Wie lange dauert die Lektion „sync.Mutex und sync.RWMutex“?

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. sync.Mutex und sync.RWMutex
  2. sync.WaitGroup
  3. sync.Once und sync.Map
  4. Race Detector und sichere Patterns
← Zurück zu Go Academy