Back to questions
101ХР
Middle+
2
Какие примитивы синхронизации есть в Go? В чем разница между Mutex и RWMutex? Когда использовать atomics?
Companies where asked
Answer from AI
sobes.tech AI
В Go есть несколько примитивов синхронизации:
- Mutex (sync.Mutex) — простой мьютекс для взаимного исключения, блокирует доступ к ресурсу для всех остальных горутин.
- RWMutex (sync.RWMutex) — расширенный мьютекс, который позволяет нескольким читателям одновременно держать блокировку, но запись эксклюзивна.
- WaitGroup — для ожидания завершения группы горутин.
- Cond — условная переменная для сигнализации между горутинами.
- Atomic operations (пакет sync/atomic) — операции над переменными без блокировок, например, атомарное увеличение счетчика.
Разница между Mutex и RWMutex:
- Mutex блокирует доступ полностью, подходит, когда операции чтения и записи равнозначны или запись преобладает.
- RWMutex позволяет нескольким читателям одновременно читать данные, блокируя запись. Используется, когда чтений значительно больше, чем записей, для повышения производительности.
Когда использовать atomics:
- Для простых операций над примитивными типами (int, uint64, указатели), когда нужна высокая производительность и минимальная задержка.
- Когда нужно избежать накладных расходов блокировок.
- Например, для счетчиков, флагов или индикаторов состояния.
Пример использования Mutex и RWMutex:
var mu sync.Mutex
var rw sync.RWMutex
// Mutex
mu.Lock()
// критическая секция
mu.Unlock()
// RWMutex
rw.RLock() // для чтения
// чтение данных
rw.RUnlock()
rw.Lock() // для записи
// изменение данных
rw.Unlock()
Пример атомарного увеличения счетчика:
import "sync/atomic"
var counter int64
atomic.AddInt64(&counter, 1)