sync.Once

作者: 申_9a33 | 来源:发表于2021-08-02 15:51 被阅读0次

sync.Once 的使用场景

sync.Once 是 Go 标准库提供的使函数只执行一次的实现,常应用于单例模式,例如初始化配置、保持数据库连接等。作用与 init 函数类似,但有区别。

1.init 函数是当所在的 package 首次被加载时执行,若迟迟未被使用,则既浪费了内存,又延长了程序加载时间。

2.sync.Once 可以在代码的任意位置初始化和调用,因此可以延迟到使用时再执行,并发场景下是线程安全的。

3.在多数情况下,sync.Once 被用于控制变量的初始化,这个变量的读写满足如下三个条件:

  • 当且仅当第一次访问某个变量时,进行初始化(写);
  • 变量初始化过程中,所有读都被阻塞,直到初始化完成;
  • 变量仅初始化一次,初始化完成后驻留在内存里。
  • sync.Once 仅提供了一个方法 Do,参数 f 是对象初始化函数。

示例

package main

import (
    "log"
    "os"
    "strconv"
    "sync"
    "time"
)

type Config struct {
    Server string
    Port   int64
}

var (
    once   sync.Once
    config *Config
)

func ReadConfig() *Config {
    once.Do(func() {
        var err error
        config = &Config{Server: os.Getenv("TT_SERVER_URL")}
        config.Port, err = strconv.ParseInt(os.Getenv("TT_PORT"), 10, 0)
        if err != nil {
            config.Port = 8080 // default port
        }
        log.Println("init config")
    })
    return config
}

func main() {
    for i := 0; i < 10; i++ {
        go func() {
            _ = ReadConfig()
        }()
    }
    time.Sleep(time.Second)
}

输出:2021/08/02 15:49:46 init config

相关文章

  • 深度剖析Golang sync.Once源码

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

  • sync.Once

    利用 sync.once 实现单例 sync.Once 实现 为什么要用defer 来加计数?不直接在后面执行计数...

  • Go语言——sync.Once分析

    Go语言——sync.Once分析 sync.Once表示只执行一次函数。要做到这点,就需要两点: 计数器,统计函...

  • golang sync.Once源代码阅读--让你的初始化只执行

    sync.Once的用处 sync.Once 主要用途执行只需要执行一次的初始化函数,比如验证器的初始,http....

  • sync.Once

    sync.Once 的使用场景 sync.Once 是 Go 标准库提供的使函数只执行一次的实现,常应用于单例模式...

  • go 中的 sync.Once

    sync.Once 是 Go 标准库提供的使函数只执行一次的实现,常应用于单例模式,sync.Once 仅提供了一...

  • sync.Once

    once结构是这样的 其中只有这么一个方法 作用是保证多个协程只执行某个函数一次为什么不能使用CAS原子操作来替代...

  • golang 系列:sync.Once 讲解

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

  • sync.Once分析

    使用场合 在实际生产中,很多时候我们需要执行只有一次的操作(如单例模式)。在golang中,我们可以简单的使用sy...

  • Go - sync.Once

    设计目的 Once 常常用来初始化单例资源,或者并发访问只需初始化一次的共享资源,或者在测试的时候初始化一次测试资...

网友评论

      本文标题:sync.Once

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