解释一下Golang中的sync.Once?

在Go语言中,sync.Once是一个同步原语,可以确保某个操作(例如初始化)只执行一次,即使在并发环境中也是安全的。

sync.Once有一个Do方法,接受一个函数作为参数。无论Do方法被调用多少次,这个函数都只会被执行一次。

以下是一个sync.Once的使用示例:

package main

import (
    "fmt"
    "sync"
)

var once sync.Once

func doSomething() {
    fmt.Println("Initialized")
}

func main() {
    for i := 0; i < 10; i++ {
        go func() {
            once.Do(doSomething)
        }()
    }
    // wait for a while to ensure all goroutines finish
    fmt.Scanln()
}

在这个示例中,即使有10个goroutine并发调用once.Do(doSomething)doSomething函数也只会被执行一次。

sync.Once在初始化全局变量或只需要执行一次的设置操作等场景中非常有用。例如,你可能要创建一个单例对象,但在并发环境中,你需要确保对象只被创建一次。在这种情况下,你可以使用sync.Once来实现这个功能。

发表评论

后才能评论