复习复习golang的库函数
type Once struct {
m Mutex
done uint32 //相当于一个flag值
}
func (o *Once) Do(f func()) {
//atomic库是原子操作,由汇编代码实现
if atomic.LoadUint32(&o.done) == 1 {
return
}
// Slow-path.
//读取o.done值前设置一个锁mutex
o.m.Lock()
defer o.m.Unlock()
if o.done == 0 {
defer atomic.StoreUint32(&o.done, 1)
f()
}
}
//主要是由原子操作atomic读取和存储o的done的数值,来实现的事务操作
有疑问加站长微信联系(非本文作者)