是否需要同步?

let*_*4be 5 go goroutine

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

func (r *Runner) init() {
  r.something = make(map[string]int)
  r.something["a"]=1

  go r.goroutine()
}
Run Code Online (Sandbox Code Playgroud)

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

没有同步可以安全吗?

换句话说:我想 goroutine start 之前重新使用从其他地方初始化的goroutine中的一些变量.这样安全吗?

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

tom*_*asz 5

当然这是安全的,否则Go中的编程可能是一场噩梦(或者至少不那么令人愉快).Go Memory Model是一个值得阅读的有趣内容.

例程创建是一个同步点.有一个非常类似于你的例子:

var a string

func f() {
    print(a)
}

func hello() {
    a = "hello, world"
    go f()
}
Run Code Online (Sandbox Code Playgroud)

有以下评论:

调用hello将在未来的某个时刻打印"hello,world"(也许在hello返回之后).

这是因为:

启动新goroutine的go语句发生 goroutine的执行开始之前.

前面的单词这里是至关重要的,因为它意味着例程创建(在一个线程中)必须与其开始同步(可能在其他线程中),因此新的例程必须可以看到对a的写入.