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

Go 关闭捕获的变量和共享数据?

Go 关闭捕获的变量和共享数据?

Go
慕盖茨4494581 2021-07-02 06:02:35
我刚刚观察并确认 Go 闭包通过引用捕获外部变量。如果变量被捕获到一个 Goroutine 中并且如果 Goroutine 复用到不同的线程中,修改闭包中的值是否安全?如果它不安全,为什么 Go 不阻止这种情况发生?或者它是否采用了某种安全机制?(比如锁)
查看完整描述

1 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

正如您所注意到的,Go 确实通过闭包中的引用来捕获外部变量。

修改闭包中的值是否安全?

它是一个变量,就像任何其他变量一样,因此适用于普通 Go 代码中的相同规则。修改它是安全的,但是如果您同时修改它,那么您需要提供自己的锁定或使用原子类型。

有关完整详细信息,请参阅Go Memory 模型

如果不安全,为什么不去阻止这种情况?

这与访问 go 例程之间共享的任何其他变量没有什么不同。你可以安全地做,也可以不安全地做——如果你愿意,Go 让你可以自由地用脚射击!

Go 有一个出色的竞争检测器,它可以发现并发变量访问问题。

或者它是否使用了一些安全机械?(比如锁)

不。Go 永远不会为你锁定东西——你需要使用同步包中提供的原语或遵循 Go 的哲学:不要通过共享内存进行通信;相反,通过通信共享内存,即使用通道在 goroutines 之间说话。


查看完整回答
反对 回复 2021-07-05
  • 1 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

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