Mutex vs RWMutex: когда использовать?
Вопрос
Объясните разницу между sync.Mutex и sync.RWMutex. В каких случаях стоит использовать каждый из них? Приведите примеры.
Ответ
sync.Mutex: - Исключительная блокировка - Только один поток может владеть мьютексом - Подходит для любых операций sync.RWMutex: - Поддерживает блокировку для чтения и записи - Множественные читатели могут работать одновременно - Писатель блокирует всех читателей - Оптимизирован для частого чтения, редкой записи
type Counter struct {
mu sync.RWMutex
value int
}
// Чтение - используем RLock
func (c *Counter) Value() int {
c.mu.RLock()
defer c.mu.RUnlock()
return c.value
}
// Запись - используем Lock
func (c *Counter) Increment() {
c.mu.Lock()
defer c.mu.Unlock()
c.value++
}
type Counter struct {
mu sync.RWMutex
value int
}
// Чтение - используем RLock
func (c *Counter) Value() int {
c.mu.RLock()
defer c.mu.RUnlock()
return c.value
}
// Запись - используем Lock
func (c *Counter) Increment() {
c.mu.Lock()
defer c.mu.Unlock()
c.value++
}
Дополнительные вопросы
Что такое writer starvation в RWMutex и как с этим бороться?