Достаточно ли одного флага для работы Mutex

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

Ответ

Нет, одного флага недостаточно. Mutex в Go реализован через комбинацию состояния (флага) и очереди ожидающих горутин. Помимо флага блокировки, используется внутренний механизм планировщика (scheduler) для управления ожиданием и пробуждением горутин.

Пример:

var mu sync.Mutex
var counter int

func increment() {
    mu.Lock()
    counter++
    mu.Unlock()
}

Здесь Lock() не просто проверяет флаг, а:

  1. Проверяет состояние мьютекса
  2. Если занят - ставит горутину в очередь ожидания
  3. Передает управление другим горутинам
  4. При разблокировке будит следующую горутину

Один флаг не обеспечил бы корректную работу в многопоточной среде из-за race conditions при проверке/установке значения.