解释一下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
来实现这个功能。