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 повышает производительность в сценариях с частыми чтениями и редкими записями.