golang实现单例模式
目录
golang实现单例模式
go已经提供了实现单例模式的工具sync.Once
示例
借用sync.Once的一次性特点
import (
"sync"
)
type singleton struct {
}
var _instance *singleton
var _once sync.Once
func GetInstance() *singleton {
_once.Do(func() {
instance = &singleton{}
})
return instance
}
once原理
用变量done的指针地址作为key,标记在atmoic中,同时借用atomic的原子特性, 达到线程安全的效果。
package sync
import (
"sync/atomic"
)
type Once struct {
done uint32
m Mutex
}
func (o *Once) Do(f func()) {
if atomic.LoadUint32(&o.done) == 0 {
// Outlined slow-path to allow inlining of the fast-path.
o.doSlow(f)
}
}
func (o *Once) doSlow(f func()) {
o.m.Lock()
defer o.m.Unlock()
if o.done == 0 {
//取done的索引地址作为key保存
defer atomic.StoreUint32(&o.done, 1)
f()
}
}
佛說大乘無量壽莊嚴清淨平等覺經pdf 净土大经科注2014-doc 此生必看的科学实验-水知道答案 印光大师十念法(胡小林主讲第1集)