Sobes.tech
Middle

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