5 вопросов
Пакет sync предоставляет примитивы синхронизации: Mutex, RWMutex, WaitGroup, Once, Pool. Необходимы для безопасной работы с общими данными из нескольких горутин.
sync.Mutex? 🟢 Лёгкий
▶
Мьютекс обеспечивает взаимное исключение: только одна горутина может держать блокировку. mu.Lock() / mu.Unlock() защищают критическую секцию. Типичный паттерн: mu.Lock(); defer mu.Unlock().
Подробнее →sync.WaitGroup? 🟢 Лёгкий
▶
WaitGroup - счётчик горутин. Add(n) увеличивает счётчик, Done() уменьшает на 1 (обычно через defer), Wait() блокирует, пока счётчик не достигнет 0.
Подробнее →sync.Once? 🟡 Средний
▶
once.Do(f) выполняет функцию f только один раз, даже при вызовах из нескольких горутин. Все остальные вызовы Do блокируются, пока первый не завершится. Используется для ленивой инициализации.
Подробнее →sync.RWMutex отличается от sync.Mutex? 🟡 Средний
▶
RWMutex разделяет блокировки на чтение (RLock/RUnlock) и запись (Lock/Unlock). Несколько горутин могут одновременно читать, но запись эксклюзивна. Эффективнее Mutex, когда чтений больше записей.
Подробнее →sync.Mutex? 🔴 Сложный
▶
Копирование мьютекса копирует его внутреннее состояние (заблокирован/нет). Копия может быть в заблокированном состоянии, что приведёт к deadlock. go vet обнаруживает копирование мьютексов.
Подробнее →