是否需要同步?

我在一个对象中定义了一个变量(r.something)


func (r *Runner) init() {

  r.something = make(map[string]int)

  r.something["a"]=1


  go r.goroutine()

}

而 r.goroutine 使用存储在 r.something 中的值而没有同步。除了 r.goroutine() 之外,没有其他人会读/写这个值


不同步是否安全?


换句话说:我想重用goroutine 启动之前在其他地方初始化的 goroutine 中的一些变量。那安全吗?


附加问题:在 r.goroutine() 完成后,我希望能够从其他地方使用 r.something(没有与其他 goroutine 的读/写重叠)。它也安全吗?


猛跑小猪
浏览 207回答 3
3回答

大话西游666

如果在这个变量上不存在不同 go-routine 的读写操作重叠的情况,那么你是对的:不需要任何同步。正如您所提到的,该变量是在您的 go-routine 开始之前初始化的,您实际上是安全的。

子衿沉夜

是的,这是安全的。根据Go 内存模型:启动新 goroutine 的 go 语句发生在 goroutine 开始执行之前在单个 goroutine 中,happens-before 顺序是程序表达的顺序这意味着您在启动 goroutine 之前对变量所做的所有更改都在该 goroutine 中可见。回答您的附加问题:这取决于。通常,如果r.goroutine()修改r.something并且您想从另一个 goroutine 读取它,则需要使用同步。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go