Основы синтаксиса Строки и руны Массивы и слайсы Map Структуры и методы Интерфейсы Горутины и конкурентность Каналы defer, panic, recover Обработка ошибок Указатели Пакет sync Тестирование Пакеты и модули Стандартная библиотека Context Generics iota и перечисления Разное / продвинутое

Пакет sync

5 вопросов

Пакет sync предоставляет примитивы синхронизации: Mutex, RWMutex, WaitGroup, Once, Pool. Необходимы для безопасной работы с общими данными из нескольких горутин.

1 Для чего нужен sync.Mutex? 🟢 Лёгкий
Ответ: B) Защиты общих данных от data race

Мьютекс обеспечивает взаимное исключение: только одна горутина может держать блокировку. mu.Lock() / mu.Unlock() защищают критическую секцию. Типичный паттерн: mu.Lock(); defer mu.Unlock().

Подробнее →
2 Что делает sync.WaitGroup? 🟢 Лёгкий
Ответ: B) Ожидает завершения набора горутин

WaitGroup - счётчик горутин. Add(n) увеличивает счётчик, Done() уменьшает на 1 (обычно через defer), Wait() блокирует, пока счётчик не достигнет 0.

Подробнее →
3 Что делает sync.Once? 🟡 Средний
Ответ: B) Гарантирует однократное выполнение функции

once.Do(f) выполняет функцию f только один раз, даже при вызовах из нескольких горутин. Все остальные вызовы Do блокируются, пока первый не завершится. Используется для ленивой инициализации.

Подробнее →
4 Чем sync.RWMutex отличается от sync.Mutex? 🟡 Средний
Ответ: B) Позволяет нескольким читателям одновременно

RWMutex разделяет блокировки на чтение (RLock/RUnlock) и запись (Lock/Unlock). Несколько горутин могут одновременно читать, но запись эксклюзивна. Эффективнее Mutex, когда чтений больше записей.

Подробнее →
5 Можно ли копировать sync.Mutex? 🔴 Сложный
Ответ: B) Нет, это приведёт к багам

Копирование мьютекса копирует его внутреннее состояние (заблокирован/нет). Копия может быть в заблокированном состоянии, что приведёт к deadlock. go vet обнаруживает копирование мьютексов.

Подробнее →