> Как передача мьютекса по значению влияет на защиту от гонок в Go? (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Ютека
Стек: Go
> Пример ответа
В Go мьютекс (sync.Mutex) должен передаваться только по указателю (*sync.Mutex). Передача мьютекса по значению создаёт копию мьютекса, что полностью разрушает защиту от гонок данных. Причина в том, что копия мьютекса - это отдельный объект, не связанный с оригиналом. Если две горутины блокируют разные копии, они не синхронизируются друг с другом, и доступ к общим данным остаётся неконтролируемым.
Пример опасного кода:
GOfunc process(data *int, mu sync.Mutex) { // передача по значениюmu.Lock()*data++mu.Unlock()}
Здесь каждая горутина получит свою копию mu, и data будет изменяться без взаимного исключения.
Правильный способ - передавать указатель:
GOfunc process(data *int, mu *sync.Mutex) {mu.Lock()*data++mu.Unlock()}
Также стоит отметить, что структуры, содержащие мьютекс (например, пул соединений), должны передаваться по указателю, чтобы мьютекс оставался общим. Встроенный анализатор Go (go vet) предупредит о передаче мьютекса по значению.
> Похожие задачи по backend
Как реализовать паттерн singleton в Go?
Почему Go хорошо работает с асинхронными задачами?
Что будет если мьютекс передается по значению в Go?
Зачем нужны указатели в структуре с мапой и мьютексом в Go, если мапа является ссылочным типом
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью