Ответ
Нет, одного флага недостаточно. Mutex в Go реализован через комбинацию состояния (флага) и очереди ожидающих горутин. Помимо флага блокировки, используется внутренний механизм планировщика (scheduler) для управления ожиданием и пробуждением горутин.
Пример:
var mu sync.Mutex
var counter int
func increment() {
mu.Lock()
counter++
mu.Unlock()
}
Здесь Lock() не просто проверяет флаг, а:
- Проверяет состояние мьютекса
- Если занят - ставит горутину в очередь ожидания
- Передает управление другим горутинам
- При разблокировке будит следующую горутину
Один флаг не обеспечил бы корректную работу в многопоточной среде из-за race conditions при проверке/установке значения.