为了账号安全,请及时绑定邮箱和手机立即绑定

是否需要同步?

是否需要同步?

Go
猛跑小猪 2021-11-01 11:01:38
我在一个对象中定义了一个变量(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 的读/写重叠)。它也安全吗?
查看完整描述

3 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

如果在这个变量上不存在不同 go-routine 的读写操作重叠的情况,那么你是对的:不需要任何同步。

正如您所提到的,该变量是您的 go-routine 开始之前初始化的,您实际上是安全的。


查看完整回答
反对 回复 2021-11-01
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

是的,这是安全的。根据Go 内存模型

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

  • 在单个 goroutine 中,happens-before 顺序是程序表达的顺序

这意味着您在启动 goroutine 之前对变量所做的所有更改都在该 goroutine 中可见。

回答您的附加问题:这取决于。通常,如果r.goroutine()修改r.something并且您想从另一个 goroutine 读取它,则需要使用同步。


查看完整回答
反对 回复 2021-11-01
  • 3 回答
  • 0 关注
  • 206 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信