Once.Do()
не возвращается, пока f()
не будет выполнен один раз.Это означает, что если несколько программ вызовут Once.Do()
одновременно, f()
будет выполнен один раз, но все вызовы будут ждать до завершения f()
(они будут заблокированы).
Ваше предлагаемое решение не имеетэто очень важное свойство!Вы только гарантируете, что f()
будет выполнен только один раз, но при одновременном вызове из нескольких программ последующие вызовы будут немедленно возвращены, даже если f()
все еще выполняется.
Когда мы используем sync.Once
, мыполагаться на это поведение, мы полагаемся на то, что f()
завершается после вызова Once.Do()
, поэтому мы можем использовать все переменные, которые f()
инициализированы безопасно, без условия гонки.