Sobes.tech
Back to questions
Senior
4

Какие примитивы синхронизации есть в Go? Чем RWMutex отличается от обычного Mutex?

Companies where asked
Betera Group

Answer from AI

sobes.tech AI

В Go для синхронизации используются примитивы из пакета sync, основные из них:

  • Mutex — обычный мьютекс для взаимного исключения, блокирует доступ к ресурсу для всех остальных горутин, пока не будет разблокирован.
  • RWMutex — мьютекс с разделением на чтение и запись. Позволяет нескольким горутинам одновременно читать данные (RLock), но запись (Lock) эксклюзивна и блокирует всех.
  • WaitGroup — для ожидания завершения группы горутин.
  • Cond — условная переменная для сигнализации между горутинами.

Отличие RWMutex от Mutex:

  • Mutex блокирует доступ полностью, позволяя только одному владельцу.
  • RWMutex позволяет множеству читателей одновременно держать блокировку, если нет писателей.
  • Запись с RWMutex эксклюзивна и блокирует всех остальных.

Пример:

var mu sync.RWMutex
var data int

func readData() int {
    mu.RLock()         // блокировка для чтения
    defer mu.RUnlock()
    return data
}

func writeData(val int) {
    mu.Lock()          // эксклюзивная блокировка для записи
    defer mu.Unlock()
    data = val
}

Использование RWMutex повышает производительность в сценариях с частыми чтениями и редкими записями.