sync.Once.Do是否保证了goroutines的可见性?

时间:2015-07-02 19:48:02

标签: go

示例here表示sync.Once.Do保证了字符串var a的goroutine可见性。如果例如sync.Once.Do调用的函数f()初始化结构实例的多个字段,那也是如此吗?结构实例的所有字段是否对其他goroutine可见而没有任何额外的同步?

1 个答案:

答案 0 :(得分:2)

让我们分解example

变量a在函数setup()返回之前设置为,因为单个goroutine中的读取和写入必须表现得好像它们按程序指定的顺序执行[ 1]。

来自setup()的{​​{1}}的单个来电发生 once.Do()的任何回复[2]。

因此,在once.Do()的任何调用返回之前,变量a都设置为。在建立关系之前不需要进一步同步。

该问题询问结构字段,而不是示例中的单个变量。就内存模型而言,struct字段是变量。适用于示例中变量的所有逻辑都适用于结构中的字段。