Mutex vs RWMutex: когда использовать?

К вопросам
Средний
Concurrency

Вопрос

Объясните разницу между 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 и как с этим бороться?