源码分析之Go Once
Go 中的 Atomic Values 等价于 C++ 的顺序一致性 atomics,等价于 Java 中的
volatile
变量;
在看 Go 中 sync.once
包中的源码实现时,疑问为什么要用atomic
的 load 和 store,而不能直接读取和赋值。
Once 代码
Go 1.18 中的源码
Once 的Do
保证只会执行函数一次,且其它go routine 会等待直到该函数执行完。
- 第15行使用原子性 Store,而不是第14行的形式,是防止出现指令重排序的情况,导致先执行
o.done == 1
,再执行f()
- 类比于 Java 实现的双重检查锁(DCL),
done
这里使用 atomic 等价于volatile
语义;
代码的官方解释见:https://codereview.appspot.com/4641066/#msg14
Go 的内存模型:https://go.dev/ref/mem