package sync
import (
"sync/atomic"
)
done uint32
m Mutex
}
func (o *Once) Do(f func()) {
// 如果第一次执行,多协程的话,这里是有可能都进来的
if atomic.LoadUint32(&o.done) == 0 {
o.doSlow(f)
}
// 后面的再来人,这里会判断为1 退出
}
func (o *Once) doSlow(f func()) {
// 那如果都进来了,锁是只有一把的
o.m.Lock()
defer o.m.Unlock()
// 第二个人进来一看,不为0了,说明执行过了
if o.done == 0 {
defer atomic.StoreUint32(&o.done, 1)
f()
}
}
once.Do如何保证只执行一次(勿喷
于 2024-05-16 12:49:59 首次发布