Sobes.tech
Junior — Middle

Czym różni się użycie standardowego mutexa od mutexa z możliwością czytania i pisania (RWMutex)?

sobes.tech AI

Odpowiedź od AI

Standardowy mutex (sync.Mutex) w Go zapewnia wyłączny dostęp do zasobu: w każdym momencie tylko jedna gorutyna może go zablokować, pozostałe czekają.

Mutex z możliwością odczytu i zapisu (sync.RWMutex) pozwala:

  • Kilka gorutyn może jednocześnie blokować mutex na odczyt (RLock), jeśli nie ma pisarza.
  • Tylko jedna gorutyna może zablokować mutex na zapis (Lock), blokując wszystkich czytelników i innych pisarzy.

To zwiększa wydajność w scenariuszach, gdzie operacji odczytu jest znacznie więcej niż zapisów, ponieważ odczyty nie blokują się nawzajem.

Przykład:

var mu sync.RWMutex
var data int

// Odczyt
mu.RLock()
fmt.Println(data)
mu.RUnlock()

// Zapis
mu.Lock()
data = 42
mu.Unlock()

Jeśli użyje się zwykłego Mutex, nawet odczyty będą się blokować nawzajem, co zmniejsza paralelizm.