简析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语言学习笔记、语法知识、技术要点和个人理解及实战

全部评论

相关推荐

nbdy:字太多了,写简历不是写自传,亮点难点技能点列出来就行,要简明扼要
点赞 评论 收藏
分享
02-15 22:29
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务