sync.Mutex og sync.RWMutex
Låse- og læse-skrive-låsemønstre
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
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
- sync.Mutex og sync.RWMutex
- sync.WaitGroup
- sync.Once og sync.Map
- Race detector og sikre mønstre