Qual é a diferença entre RW Mutex e um mutex normal?
sobes.tech IA
Resposta da IA
sync.RWMutex permite que múltiplas goroutines leiam dados simultaneamente, mas apenas uma goroutine pode escrever dados de cada vez. sync.Mutex bloqueia o acesso para qualquer outra goroutine que tente obter o bloqueio (seja para leitura ou escrita), até que a primeira goroutine libere o bloqueio.
-
sync.Mutex: Bloqueio exclusivo. Está bloqueado ou não. Apenas uma goroutine pode manter o mutex em qualquer momento. É adequado quando as operações de leitura e escrita são frequentes ou têm uma duração semelhante.// Exemplo de uso de Mutex var mu sync.Mutex var counter int func increment() { mu.Lock() counter++ mu.Unlock() } -
sync.RWMutex: Bloqueio para leitura e escrita. Permite que múltiplas goroutines mantenham o bloqueio para leitura simultaneamente, mas o bloqueio para escrita é exclusivo. Uma goroutine que mantém o bloqueio para escrita bloqueia tanto outras operações de escrita quanto de leitura. As goroutines que mantêm o bloqueio para leitura bloqueiam as operações de escrita, mas não outras operações de leitura. É adequado quando as operações de leitura ocorrem com muito mais frequência do que as operações de escrita.// Exemplo de uso de RWMutex var rwmu sync.RWMutex var data map[string]string = make(map[string]string) func readData(key string) string { rwmu.RLock() // Obtemos o bloqueio para leitura value := data[key] rwmu.RUnlock() // Liberamos o bloqueio para leitura return value } func writeData(key, value string) { rwmu.Lock() // Obtemos o bloqueio para escrita data[key] = value rwmu.Unlock() // Liberamos o bloqueio para escrita }
As diferenças principais podem ser resumidas na tabela a seguir:
| Característica | sync.Mutex |
sync.RWMutex |
|---|---|---|
| Tipo de bloqueio | Exclusivo (leitura/escrita) | Compartilhado (leitura) + exclusivo (escrita) |
| Acesso simultâneo | Uma goroutine | Múltiplas goroutines para leitura, uma para escrita |
| Método de bloqueio para leitura | Lock() |
RLock() |
| Método de bloqueio para escrita | Lock() |
Lock() |
| Método de desbloqueio para leitura | Unlock() |
RUnlock() |
| Método de desbloqueio para escrita | Unlock() |
Unlock() |
| Desempenho | Mais simples, potencialmente mais lento em leituras frequentes | Mais complexo, potencialmente mais rápido em leituras frequentes e escritas raras |