Какие средства синхронизации кроме мьютексов используются в Go
Что проверяют
Знаете ли вы, что основным средством считается канал, и ориентируетесь ли в остальном наборе.
Как отвечать
Главное средство это каналы. Идея языка в том, чтобы передавать данные между горутинами, а не защищать общую память. Канал одновременно передаёт значение и синхронизирует: отправка и получение образуют точку встречи. В связке с конструкцией выбора он же обрабатывает несколько источников, таймауты и отмену.
Дальше по пакету синхронизации:
WaitGroup: дождаться завершения группы горутин. Счётчик увеличивают до запуска, уменьшают отложенным вызовом первой строкой внутри;Once: однократное выполнение, обычно ленивая инициализация. Гарантирует, что при одновременном вызове из сотни горутин функция выполнится один раз, а остальные дождутся;Cond: ожидание условия с оповещением. В Go применяется редко, потому что почти всегда задача решается каналом;RWMutex: разделение читателей и писателей. Формально мьютекс, но принципиально другой по поведению;Pool: переиспользование временных объектов ради снижения нагрузки на сборщик. Не кэш: объекты оттуда могут пропасть в любой момент.
Атомарные операции: сложение, обмен, сравнение с обменом над числами и указателями. Для счётчика или флага это заметно дешевле блокировки. С версии 1.19 есть типы с методами, которые труднее использовать неправильно.
Контекст: передаёт сигнал отмены и предельное время по всему дереву вызовов. Формально не примитив синхронизации, но на практике именно он координирует завершение работы.
Расширения: группа с обработкой ошибки и отменой остальных, семафор для ограничения одновременности, схлопывание одинаковых параллельных запросов в один.
Правило выбора: передаёте данные, значит канал; защищаете состояние, значит мьютекс или атомарная операция. Попытка защитить состояние каналом обычно даёт медленный и запутанный код.
Где спотыкаются
Пытаются заменить каналами всю синхронизацию.
Ставят увеличение счётчика группы ожидания внутри запускаемой горутины.
Считают пул временных объектов кэшем.
Не передают контекст и не могут отменить работу.