sync.once可以控制函数只能被调用一次。不能多次重复调用。
一般用来作系统初始化工作。
源码实现非常的简单:
type Once struct {
m Mutex
done uint32
}
func (o *Once) Do(f func()) {
if atomic.LoadUint32(&o.done) == 1 {
return
}
// Slow-path.
o.m.Lock() //Once.m是一个互斥锁,在进行Do()操作时,进行互斥操作
defer o.m.Unlock()
if o.done == 0 {
defer atomic.StoreUint32(&o.done, 1)
f()
}
}
核心思想是使用原子计数记录被执行的次数。使用Mutex Lock Unlock锁定被执行函数,防止被重复执行。