简析Go语言中使用sync.Once实现单例模式
所谓单例模式(singleton),即程序运行中仅有一个实例且仅被执行一次。sync.Once可以保证任意一个函数在程序运行期间仅被执行一次。使用非常简单。
import ( "fmt" "sync" ) var a = 0 var once sync.Once func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) go func(i int) { once.Do(func() { a++ }) wg.Done() }(i) } wg.Wait() fmt.Println(a) } > go run singleton-case.go 1
从上例可以看出,有5个goroutine操作a++,但是a的最终值为1。
once.Do会等待f执行完毕后返回,这期间其他goroutine执行once.Do将会阻塞等待。once.Do函数返回后,后续的goroutine再执行Do函数将不再执行f(示例中匿名函数)并立即返回。如果f中出现panic,sync.Once原语也会任务once.Do执行完毕,后续对once.Do的调用将不再执行f。
Go语言基础及实战 文章被收录于专栏
Go语言学习笔记、语法知识、技术要点和个人理解及实战