Go sync.Once 很简单……它真的是这样吗?

这是关于在 Go 中处理并发的系列文章的一部分,涵盖内容如下:

  • 已涵盖内容:Go sync.Mutex: Normal and Starvation Mode等 6 篇文章及相关图片。
  • Go sync.Once:

    • 用途:用于确保函数只运行一次,可用于初始化单例资源等,如设置数据库连接池等。
    • 特点:延迟操作至首次需要时(懒加载),可提高运行时性能和减少初始内存使用;用完即退役,不能重置;若函数在运行时 panic,后续调用不会再次运行该函数;处理函数中的错误较繁琐。
    • 从 Go 1.21 起,有OnceFuncOnceValue[T]OnceValues[T, K]OnceFunc可多次调用但函数只运行一次,OnceValue记住首次执行结果并在后续调用时返回缓存结果,OnceValues可返回多个值包括错误。
  • 工作原理:

    • 基本结构:type Once struct { done atomic.Uint32, m Mutex }done使用原子操作且位于结构体顶部以优化性能。
    • 实现方式:通过互斥锁Mutex和原子操作atomic.Uint32实现,先加锁再判断done标志,若未运行则设置done并运行函数,可优化为快速路径和慢速路径,还可通过defer和拆分函数来优化以利于编译器内联。使用CompareAndSwap操作也存在问题,可能导致资源未准备好就被使用。
  • 保持联系:作者 Phuong Le 是 VictoriaMetrics 的软件工程师,欢迎交流,相关文章有多个关于 Go 的系列文章等。
  • 关于 VictoriaMetrics:是一个快速、开源且节省成本的监控服务工具,作者团队是 Go 语言爱好者。
阅读 14
0 条评论