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 |