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

全部评论

相关推荐

10-21 00:37
已编辑
门头沟学院 C++
小浪_Coding:你问别人,本来就是有求于人,别人肯定没有义务免费回答你丫, 有点流量每天私信可能都十几,几十条的,大家都有工作和自己的事情, 付费也是正常的, 就像你请别人搭把手, 总得给人家买瓶水喝吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务