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()
}
© Kimi Tsai all right reserved.            Updated : 2023-07-12 09:04:54

results matching ""

    No results matching ""

    results matching ""

      No results matching ""