Golang Once源码解析
sync.Once可以实现单例模式,确保sync.Once.Do(f func())只会被执行一次,可以初始化某个实例单例。
针对Golang 1.9的sync.Once,与Golang 1.10一样。 源代码位置:sync\once.go。
结构体
Once结构体定义如下:
type Once struct {
m Mutex
done uint32 // 初始值为0表示还未执行过,1表示已经执行过
}
Do
func (o *Once) Do(f func()) {
// done==1表示已经执行过了,直接结束返回
if atomic.LoadUint32(&o.done) == 1 {
return
}
// 锁住对象,避免并发问题
o.m.Lock()
defer o.m.Unlock()
if o.done == 0 {
// 先将done设置为1,再执行f函数
defer atomic.StoreUint32(&o.done, 1)
f()
}
}
需要注意的是执行f函数是同步进行的,也就是说可能存在阻塞问题。
转载于:https://blog.51cto.com/qiangmzsx/2106069
到此这篇关于“Golang Once源码解析”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!您可能感兴趣的文章:
Golang Once源码解析
Golang package sync 剖析(一): sync.Once
【Go】我与sync.Once的爱恨纠缠
为什么很多公司转型 Go 语言开发?Go 语言能做什么
jQuery源码分析系列(31) : Ajax deferred实现
Golang设计模式之单例模式
jQuery源码分析系列:Callback深入
Golang 源码剖析:fmt 标准库 --- Print* 是怎么样输出的?
Golang并发:除了channel,你还有其他选择
asp.net 析构函数详解与用法