golang sync.Once应用场景

    1. chan只关闭一次
type MyChan struct {
    c    chan int
    once sync.Once
}

func (m *MyChan) SafeClose() {
    m.once.Do(func() {
        close(m.c)
    })
}
    1. 懒加载
type Person struct{}
var per *Person
var once sync.Once

func GetInstance() *Person {
    once.Do(func() {
        per = new(Person)
    })
    return per
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            p := GetInstance()
            fmt.Printf("%p\n", p)
        }()
    }
    wg.Wait()
}

总结:

type Once struct {
    done uint32
    m    Mutex
}

sync.Once是一种单例模式, 并且保证 once.Do(f) 在返回时, f()一定已经被执行了, sync.Once源码中, 将高频访问的done字段放到第一位可减少cpu的offset计算, 提高效率

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 锁 Mutex 互斥锁 互斥即不可同时运行。即使用了互斥锁的两个代码片段互相排斥,只有其中一个代码片段执行完成后,...
    Xuenqlve阅读 736评论 0 1
  • 设计目的 Once 常常用来初始化单例资源,或者并发访问只需初始化一次的共享资源,或者在测试的时候初始化一次测试资...
    kyo1992阅读 713评论 0 0
  • 并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因。 Go语言...
    羋学僧阅读 671评论 0 6
  • 并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因。 Go语言...
    雪上霜阅读 250评论 0 0
  • 初探之 sync.Once # 描述 sync.Once 是 Golang package 中使方法只执行一次的对...
    哆啦在这A梦在哪阅读 485评论 0 1