🤔Чем отличается RW Мьютекс от обычного?



RWMutex (Read-Write Mutex) позволяет разделять доступ для чтения и блокировать только для записи, в отличие от обычного Mutex, который блокирует как чтение, так и запись. С помощью RWMutex можно использовать RLock для параллельного доступа к данным в режиме чтения, что увеличивает производительность, если много горутин читают данные и редко их изменяют. Для записи используется Lock, который блокирует доступ к данным для всех других операций чтения и записи.



🚩Обычный мьютекс (sync.Mutex)



sync.Mutex используется для обеспечения эксклюзивного доступа к ресурсу для всех операций (чтение и запись). Подходит для сценариев с частыми операциями записи или равномерным распределением чтений и записей.

var mu sync.Mutex

var counter int



func increment() {

mu.Lock()

counter++

mu.Unlock()

}



func main() {

var wg sync.WaitGroup



for i := 0; i < 10; i++ {

wg.Add(1)

go func() {

defer wg.Done()

increment()

}()

}



wg.Wait()

fmt.Println("Counter:", counter)

}




🚩RW мьютекс (sync.RWMutex)



sync.RWMutex предоставляет два типа блокировок: для чтения (RLock) и для записи (Lock). Позволяет нескольким горутинам одновременно читать данные, если нет активных блокировок для записи. Улучшает производительность в сценариях с частыми чтениями и редкими записями.

var rwMu sync.RWMutex

var counter int



func readCounter() int {

rwMu.RLock()

defer rwMu.RUnlock()

return counter

}



func increment() {

rwMu.Lock()

counter++

rwMu.Unlock()

}



func main() {

var wg sync.WaitGroup



for i := 0; i < 5; i++ {

wg.Add(1)

go func() {

defer wg.Done()

fmt.Println("Read Counter:", readCounter())

}()

}



for i := 0; i < 5; i++ {

wg.Add(1)

go func() {

defer wg.Done()

increment()

}()

}



wg.Wait()

fmt.Println("Final Counter:", counter)

}




🚩Сравнение



🟠Эксклюзивность

sync.Mutex блокирует доступ для всех операций.

sync.RWMutex позволяет одновременное чтение, но блокирует доступ при записи.



🟠Производительность

sync.Mutex подходит для частых записей или равномерного распределения операций.

sync.RWMutex подходит для частых чтений и редких записей.



🟠Применение:

Используйте sync.Mutex для эксклюзивного доступа без различий между чтением и записью.

Используйте sync.RWMutex для улучшения производительности при частых чтениях.



Ставь 👍 и забирай 📚 Базу знаний