golang源码分析 sync.Once

crud-bird · · 993 次点击
<a href="/user/crud-bird" title="@crud-bird">@crud-bird</a> go标准库也是用的双检查结构,为什么用原子变量做?我猜是为了,在任何硬件(x86/arm/misp)陈诺不出问题。
#4
更多评论
你修改之后 o.done = 1是锁住的区域赋值的, if o.done==1没加锁读, 这里就有数据竞争的问题。除非用lock把你读的地方包裹下。好了,你现在得到的代码才是每次都能正确处理的实现。 对于这种代码,如果想优化,把锁的颗粒度变小,可以atomic把done的地方改改,最后发现,我c 这不就是标准库的写法吗。。。
#1
这里用的双检查锁结构,if o.done==1这一行并发读是没问题的,不存在你所谓的数据竞争。
#2