代码
package sync
import (
"sync"
"sync/atomic"
)
type Once struct {
done atomic.Uint32
m sync.Mutex
}
func (o *Once) Do(f func()) {
if o.done.Load() == 0 {
o.doSlow(f)
}
}
func (o *Once) doSlow(f func()) {
o.m.Lock()
defer o.m.Unlock()
if o.done.Load() == 0 {
defer o.done.Store(1)
f()
}
}
分析
go once源码非常少,先看看数据结构
type Once struct {
done atomic.Uint32
m sync.Mutex
}
就2个字段
- done:原子遍历
- m:互斥锁
Do函数其实非常简单,首先判断一下原子遍历done值是否等于0,如果等于0,就执行f函数,并且将值修改成1,这个修改和执行f函数加
```go锁
``go