golang熟练运用sync.Once

2020-04-21  本文已影响0人  化蝶飞618

sync.Once的作用

控制需要执行的代码在执行时候有且只执行一次,经常用在单例模式下,保证对象只生成一次。
注意:这里的执行一次并不是里面的函数,而是once对象只执行一次,即使里面的函数变了也不再执行,例如下面的案例可以看出,及时换了执行函数也只执行了一次

func main()  {
    for i, v := range make([]string, 5) {
        once.Do(function1)
        fmt.Println("function1:", v, "---", i)
    }
    for i := 0; i < 5; i++ {

        go func() {
            once.Do(function2)
            fmt.Println("function2", i, "---",)
        }()
    }
    time.Sleep(2 * time.Second)
}
func function1() {
    fmt.Println("exec function1")
}
func function2() {
    fmt.Println("exec function2")
}
image.png

内部原理

通过看源码,知道内部通过互斥锁实现

type Once struct {
    done uint32
    m    Mutex
}
func (o *Once) Do(f func()) {
    if atomic.LoadUint32(&o.done) == 0 {
        // Outlined slow-path to allow inlining of the fast-path.
        o.doSlow(f)
    }
}
if atomic.LoadUint32(&o.done) == 0 {
        // Outlined slow-path to allow inlining of the fast-path.
        o.doSlow(f)
    }
}
上一篇 下一篇

猜你喜欢

热点阅读