Вопрос сравнивает два типа мьютексов, акцентируя внимание на оптимизации для чтения.
Mutex блокирует доступ полностью, а RWMutex позволяет множеству горутин читать одновременно, но блокирует при записи. RWMutex эффективнее, когда чтение происходит чаще записи.
Mutex (обычный):
Гарантирует, что только одна горутина может владеть блокировкой.
Подходит, если операции чтения/записи редки или равномерны.
RWMutex (чтение-запись):
Чтение: Множество горутин могут удерживать RLock().
Запись: Только одна горутина может удерживать Lock() (блокирует и чтение, и запись).
Пример:
package main
import (
"sync"
"time"
)
var (
counter int
mu sync.RWMutex
)
func read() {
mu.RLock() // Множество горутин могут читать
defer mu.RUnlock()
_ = counter // Чтение
}
func write() {
mu.Lock() // Только одна горутина может писать
defer mu.Unlock()
counter++ // Запись
}Когда использовать:
RWMutex: если чтение >> записи (например, кэш).
Mutex: если операции записи частые или код простой.
Вывод:RWMutex снижает конкуренцию при частом чтении.