Go Academy · Lektion

sync.Mutex og sync.RWMutex

Låse- og læse-skrive-låsemønstre

Lektion 1 af 413 trin

sync.Mutex og sync.RWMutex er en gratis Go Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Go Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Go Academy-kurset indeholder 4 lektioner i alt.

Hvorfor mutexer?

Når flere goroutines deler tilstand, der kan ændres, forårsager samtidige læsninger og skrivninger datakapløb. En mutex serialiserer adgangen, så kun én goroutine ad gangen går ind i den kritiske sektion.

Grundlæggende om sync.Mutex

Lås før læsning eller skrivning af delt tilstand, og lås op bagefter. Brug defer for at garantere, at der låses op, selv hvis funktionen udløser panik.

var mu sync.Mutex
var counter int

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

Indlejring af Mutex i en struktur

Indlejr mutexen i den struktur, som den beskytter. Konventionen er at erklære mutexen lige over de felter, som den beskytter.

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

Kopiér ikke en Mutex

En Mutex må ikke kopieres efter første brug. Videregiv den via en pointer, eller indlejr den i en struktur, der videregives via en pointer. Værktøjet go vet registrerer kopier.

sync.RWMutex

sync.RWMutex tillader flere samtidige læsere, men kun én skriver. Brug den, når læsninger dominerer, og skrivninger er sjældne, for at øge gennemløbet.

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 sammenlignet med Lock

RLock erhverver en læselås (delt), mens Lock erhverver en skrivelås (eksklusiv). En ventende skrivelås blokerer nye læselåse og forhindrer udsultning af skrivere.

TryLock (Go 1.18+)

mu.TryLock() erhverver kun låsen, hvis den i øjeblikket er ulåst, og returnerer en boolesk værdi. Det er nyttigt, når blokering ikke er acceptabelt.

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

Deadlocks

En deadlock opstår, når goroutine A holder lås 1 og venter på lås 2, mens goroutine B holder lås 2 og venter på lås 1. Erhverv altid låse i samme rækkefølge, og hold kritiske sektioner korte.

Låsegranularitet

En grovkornet lås er lettere at forstå, men reducerer samtidigheden. Finkornet låsning forbedrer gennemløbet, men øger kompleksiteten og risikoen for deadlocks. Start grovkornet, og optimér kun, hvis profilering viser indbyrdes blokering.

Mutex sammenlignet med kanal

Brug en mutex til at beskytte delt tilstand med mange læsere eller skrivere. Brug en kanal til at overføre ejerskab af data mellem goroutines. Kanaler er til kommunikation, mutexer er til synkronisering.

sync.Locker-interfacet

sync.Locker er et interface med Lock og Unlock. Både Mutex og RWMutex implementerer det, så hjælpefunktioner kan acceptere begge typer.

Hurtigt tjek

Hvornår bør du bruge sync.RWMutex i stedet for sync.Mutex?

Opsummering: Mutex og RWMutex

Vigtige pointer:

  • Mutex serialiserer adgangen; brug altid defer Unlock
  • Kopiér aldrig en Mutex efter første brug
  • RWMutex: flere læsere ELLER én skriver
  • Erhverv låse i en ensartet rækkefølge for at undgå deadlocks
Gratis at komme i gang

Lær Go med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “sync.Mutex og sync.RWMutex” gratis?

Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “sync.Mutex og sync.RWMutex”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Go Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “sync.Mutex og sync.RWMutex”?

Låse- og læse-skrive-låsemønstre Du øver dig i Go Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Go Academy?

Der kræves ingen tidligere erfaring. Go Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “sync.Mutex og sync.RWMutex”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Go Academy-lektion?

Ja. Alle Go Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. sync.Mutex og sync.RWMutex
  2. sync.WaitGroup
  3. sync.Once og sync.Map
  4. Race detector og sikre mønstre
← Tilbage til Go Academy