返回
Go 语言的 sync.Once:代码演示如何实现单例模式
后端
2023-09-20 02:27:21
前言
在 Go 语言中,sync.Once
是一个非常有用的并发编程工具,它可以确保某个函数只会被执行一次,即使在多个 goroutine 中也不会重复执行。这在很多场景下都非常有用,比如初始化全局变量、加载配置文件等。
原理
sync.Once
的原理非常简单,它内部维护了一个标志位 m.done
,当这个标志位被设置为 true
时,Do
方法就会直接返回,而不会再执行函数 f
。
使用方法
使用 sync.Once
非常简单,只需要调用它的 Do
方法即可。Do
方法接收一个函数作为参数,这个函数只会被执行一次。
package main
import (
"fmt"
"sync"
)
var once sync.Once
func main() {
once.Do(func() {
fmt.Println("Hello, world!")
})
}
输出:
Hello, world!
实现单例模式
sync.Once
可以很容易地用来实现单例模式。单例模式是一种设计模式,它可以确保某个类只有一个实例。在 Go 语言中,我们可以使用 sync.Once
来实现单例模式。
package main
import (
"fmt"
"sync"
)
type Singleton struct {
}
var (
once sync.Once
instance *Singleton
)
func GetInstance() *Singleton {
once.Do(func() {
instance = &Singleton{}
})
return instance
}
func main() {
s1 := GetInstance()
s2 := GetInstance()
fmt.Println(s1 == s2) // true
}
输出:
true
总结
sync.Once
是一个非常有用的并发编程工具,它可以确保某个函数只会被执行一次,即使在多个 goroutine 中也不会重复执行。这在很多场景下都非常有用,比如初始化全局变量、加载配置文件等。
sync.Once
的原理非常简单,它内部维护了一个标志位 m.done
,当这个标志位被设置为 true
时,Do
方法就会直接返回,而不会再执行函数 f
。
使用 sync.Once
非常简单,只需要调用它的 Do
方法即可。Do
方法接收一个函数作为参数,这个函数只会被执行一次。
sync.Once
可以很容易地用来实现单例模式。单例模式是一种设计模式,它可以确保某个类只有一个实例。在 Go 语言中,我们可以使用 sync.Once
来实现单例模式。