Sobes.tech
Middle

Wat is het verschil tussen RW Mutex en een gewone mutex?

sobes.tech AI

Antwoord van AI

sync.RWMutex staat toe dat meerdere goroutines gelijktijdig gegevens lezen, maar slechts één goroutine kan gegevens schrijven. sync.Mutex blokkeert de toegang voor elke andere goroutine die probeert het slot te verkrijgen (of het nu voor lezen of schrijven is), totdat de eerste goroutine het slot vrijgeeft.

  • sync.Mutex: Exclusieve slot. Het is ofwel geblokkeerd of niet. Slechts één goroutine kan het mutex op elk moment vasthouden. Geschikt wanneer lees- en schrijfoperaties vaak voorkomen of vergelijkbare duur hebben.

    // Voorbeeld van Mutex gebruik
    var mu sync.Mutex
    var counter int
    
    func increment() {
        mu.Lock()
        counter++
        mu.Unlock()
    }
    
  • sync.RWMutex: Slot voor lezen en schrijven. Staat toe dat meerdere goroutines het slot voor lezen gelijktijdig vasthouden, maar het slot voor schrijven is exclusief. Een goroutine die het slot voor schrijven vasthoudt, blokkeert zowel andere schrijf- als leesbewerkingen. Goroutines die het slot voor lezen vasthouden, blokkeren schrijfbewerkingen, maar niet andere leesbewerkingen. Geschikt wanneer leesoperaties veel vaker voorkomen dan schrijfoperaties.

    // Voorbeeld van RWMutex gebruik
    var rwmu sync.RWMutex
    var data map[string]string = make(map[string]string)
    
    func readData(key string) string {
        rwmu.RLock() // Verkrijg het slot voor lezen
        value := data[key]
        rwmu.RUnlock() // Vrijgeven van het slot voor lezen
        return value
    }
    
    func writeData(key, value string) {
        rwmu.Lock() // Verkrijg het slot voor schrijven
        data[key] = value
        rwmu.Unlock() // Vrijgeven van het slot voor schrijven
    }
    

De belangrijkste verschillen kunnen worden samengevat in de onderstaande tabel:

Kenmerk sync.Mutex sync.RWMutex
Type slot Exclusief (lezen/schrijven) Gedeeld (lezen) + exclusief (schrijven)
Gelijktijdige toegang Eén goroutine Meerdere goroutines voor lezen, één voor schrijven
Methode voor lezen blokkering Lock() RLock()
Methode voor schrijven blokkering Lock() Lock()
Methode voor lezen ontgrendelen Unlock() RUnlock()
Methode voor schrijven ontgrendelen Unlock() Unlock()
Prestaties Eenvoudiger, mogelijk langzamer bij frequente lezingen Complexer, mogelijk sneller bij frequente lezingen en zeldzame schrijvingen