Можно ли использовать несколько Mutex в рамках вызова одной функции

«Можно ли использовать несколько Mutex в рамках вызова одной функции» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, можно использовать несколько Mutex в одной функции, но важно избегать deadlock'ов. Например, если нужно заблокировать несколько мьютексов, соблюдай одинаковый порядок их захвата во всех горутинах.

var mu1, mu2 sync.Mutex

func process() {
    mu1.Lock()
    defer mu1.Unlock()

    mu2.Lock()
    defer mu2.Unlock()

    // работа с защищенными данными
}

Опасность: если в другой горутине порядок будет обратным (mu2 -> mu1), может возникнуть deadlock. Для таких случаев лучше использовать sync.RWMutex или пересматривать архитектуру.