Do函数里面 刚开始进来的时候,直接用0.done == 0 判断也能达到效果,atomic.LoadUint32(&o.done) == 0目的是啥,为了很多goroutine同时调用Do函数,减少o.m.Lock()的调用吗
感谢解答,其实道理我能理解,但是就代码论代码,如果 sync.Once 写成如下这样,会有线程安全问题吗?如果有,会哪些地方有线程安全问题。
```go
type Once struct {
done uint32
m Mutex
}
func (o *Once) Do(f func()) {
if o.done == 0 {
o.doSlow(f)
}
}
func (o *Once) doSlow(f func()) {
o.m.Lock()
defer o.m.Unlock()
if o.done == 0 {
defer o.done = 1
f()
}
}
```
#14
更多评论
<a href="/user/kingJ" title="@kingJ">@kingJ</a> 线程安全是指啥,两个goroutine同时读一个int应该不会panic
#2