美文网首页
golang熟练运用sync.Once

golang熟练运用sync.Once

作者: 化蝶飞618 | 来源:发表于2020-04-21 17:34 被阅读0次

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)
    }
}

相关文章

  • golang熟练运用sync.Once

    sync.Once的作用 控制需要执行的代码在执行时候有且只执行一次,经常用在单例模式下,保证对象只生成一次。注意...

  • golang熟练运用context

    什么是context go从1.7版本之后开始引入了context,它的作用主要是传递上下文信息,像一个大容器,里...

  • golang sync.Once 应用

    sync.Once能确保实例化对象Do方法在多线程环境只运行一次,内部通过互斥锁实现 示例 输出 2018/03/...

  • golang sync.once解析

    实现原理(当前代码版本go version go1.11.4 ) 1.atomic 原子操作计数器,用于记录此On...

  • golang的sync.Once

    很早就知道sync.Once,一直以来都觉得这个功能用处不大,所以就没关注,在项目中也没使用过它。原因很简单,可以...

  • Golang sync.Once使用

    程序输出如下,

  • 深度剖析Golang sync.Once源码

    目录 什么是sync.Once 如何使用sync.Once 源码分析 什么是sync.Once Once 可以用来...

  • golang 系列:sync.Once 讲解

    sync.Once 介绍 之前提到过 Go 的并发辅助对象:WaitGroup[https://mp.weixin...

  • 解析Golang sync.Once源码

    数据结构 核心代码 ref https://segmentfault.com/a/1190000039294152...

  • golang sync.Once应用场景

    chan只关闭一次 懒加载 总结: sync.Once是一种单例模式, 并且保证 once.Do(f) 在返回时,...

网友评论

      本文标题:golang熟练运用sync.Once

      本文链接:https://www.haomeiwen.com/subject/bccpihtx.html