Care este diferența dintre RW Mutex și un mutex obișnuit?
sobes.tech AI
Răspuns de la AI
sync.RWMutex permite mai multor goroutines să citească datele în același timp, dar doar o goroutine poate scrie datele la un moment dat. sync.Mutex blochează accesul pentru orice altă goroutine care încearcă să obțină blocarea (fie pentru citire, fie pentru scriere), până când prima goroutine eliberează blocarea.
-
sync.Mutex: Blocare exclusivă. Este fie blocată, fie nu. Doar o goroutine poate menține mutex-ul într-un moment dat. Potrivit atunci când operațiile de citire și scriere sunt frecvente sau au o durată similară.// Exemplu de utilizare Mutex var mu sync.Mutex var counter int func increment() { mu.Lock() counter++ mu.Unlock() } -
sync.RWMutex: Blocare pentru citire și scriere. Permite mai multor goroutines să mențină blocarea pentru citire în același timp, dar blocarea pentru scriere este exclusivă. O goroutine care deține blocarea pentru scriere blochează atât alte operații de scriere, cât și de citire. Goroutines care dețin blocarea pentru citire blochează operațiile de scriere, dar nu și alte operații de citire. Potrivit atunci când operațiile de citire apar mult mai frecvent decât cele de scriere.// Exemplu de utilizare RWMutex var rwmu sync.RWMutex var data map[string]string = make(map[string]string) func readData(key string) string { rwmu.RLock() // Obținem blocarea pentru citire value := data[key] rwmu.RUnlock() // Eliberăm blocarea pentru citire return value } func writeData(key, value string) { rwmu.Lock() // Obținem blocarea pentru scriere data[key] = value rwmu.Unlock() // Eliberăm blocarea pentru scriere }
Principalele diferențe pot fi rezumate în tabelul de mai jos:
| Caracteristică | sync.Mutex |
sync.RWMutex |
|---|---|---|
| Tipul de blocare | Excluziv (citire/scriere) | Partajat (citire) + exclusiv (scriere) |
| Acces simultan | O goroutine | Multe goroutines pentru citire, una pentru scriere |
| Metoda de blocare pentru citire | Lock() |
RLock() |
| Metoda de blocare pentru scriere | Lock() |
Lock() |
| Metoda de deblocare pentru citire | Unlock() |
RUnlock() |
| Metoda de deblocare pentru scriere | Unlock() |
Unlock() |
| Performanță | Mai simplu, potențial mai lent în cazul citirilor frecvente | Mai complex, potențial mai rapid în cazul citirilor frecvente și scrierilor rare |