Sync Once
- Run one-time initialization functions
once.Do(funcValue)
var once sync.Once once.Do(func() { // ... }) - sync.Once ensure that only one call to Do ever calls the function passed in - even on different goroutines.
Exercises
Use mutex
https://go.dev/play/p/ufn39IZHLbV
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
var mu sync.Mutex
var flag bool
load := func() {
fmt.Println("Run only once initialization function")
}
wg.Add(10)
for i := 0; i < 10; i++ {
go func() {
defer wg.Done()
// modify so that load function gets called only once.
if !flag {
mu.Lock()
if !flag {
load()
flag = true
}
mu.Unlock()
}
}()
}
wg.Wait()
}
Use sync.Once
https://go.dev/play/p/taHswNsKvqJ
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
var once sync.Once
load := func() {
fmt.Println("Run only once initialization function")
}
wg.Add(10)
for i := 0; i < 10; i++ {
go func() {
defer wg.Done()
// modify so that load function gets called only once.
once.Do(load)
}()
}
wg.Wait()
}