Sobes.tech
Middle

Czym różni się RW Mutex od zwykłego mutexu?

sobes.tech AI

Odpowiedź od AI

sync.RWMutex pozwala wielu goroutine jednocześnie czytać dane, ale tylko jedna goroutine może zapisywać dane w tym samym czasie. sync.Mutex blokuje dostęp dla każdej innej goroutine próbującej uzyskać blokadę (czy to do odczytu, czy do zapisu), dopóki pierwsza goroutine nie zwolni blokady.

  • sync.Mutex: Wyłącznik ekskluzywny. Jest albo zablokowany, albo nie. Tylko jedna goroutine może trzymać mutex w danym momencie. Nadaje się, gdy operacje odczytu i zapisu są częste lub mają podobny czas trwania.

    // Przykład użycia Mutex
    var mu sync.Mutex
    var counter int
    
    func increment() {
        mu.Lock()
        counter++
        mu.Unlock()
    }
    
  • sync.RWMutex: Blokada do odczytu i zapisu. Pozwala wielu goroutine na jednoczesne trzymanie blokady do odczytu, ale blokada do zapisu jest wyłączna. Goroutine trzymająca blokadę do zapisu blokuje zarówno inne operacje zapisu, jak i odczytu. Goroutine trzymająca blokadę do odczytu blokuje operacje zapisu, ale nie inne odczyty. Nadaje się, gdy operacje odczytu są znacznie częstsze niż operacje zapisu.

    // Przykład użycia RWMutex
    var rwmu sync.RWMutex
    var data map[string]string = make(map[string]string)
    
    func readData(key string) string {
        rwmu.RLock() // Uzyskujemy blokadę do odczytu
        value := data[key]
        rwmu.RUnlock() // Zwolniamy blokadę do odczytu
        return value
    }
    
    func writeData(key, value string) {
        rwmu.Lock() // Uzyskujemy blokadę do zapisu
        data[key] = value
        rwmu.Unlock() // Zwolniamy blokadę do zapisu
    }
    

Główne różnice można podsumować w tabeli:

Charakterystyka sync.Mutex sync.RWMutex
Typ blokady Ekskluzywna (odczyt/zapis) Wspólna (odczyt) + ekskluzywna (zapis)
Dostęp równoczesny Jedna goroutine Wiele goroutine do odczytu, jedna do zapisu
Metoda blokady do odczytu Lock() RLock()
Metoda blokady do zapisu Lock() Lock()
Metoda odblokowania do odczytu Unlock() RUnlock()
Metoda odblokowania do zapisu Unlock() Unlock()
Wydajność Prostszy, potencjalnie wolniejszy przy częstych odczytach Bardziej skomplikowany, potencjalnie szybszy przy częstych odczytach i rzadkich zapisach