我刚刚观察并确认 Go 闭包通过引用捕获外部变量。如果变量被捕获到一个 Goroutine 中并且如果 Goroutine 复用到不同的线程中,修改闭包中的值是否安全?如果它不安全,为什么 Go 不阻止这种情况发生?或者它是否采用了某种安全机制?(比如锁)
1 回答
精慕HU
TA贡献1845条经验 获得超8个赞
正如您所注意到的,Go 确实通过闭包中的引用来捕获外部变量。
修改闭包中的值是否安全?
它是一个变量,就像任何其他变量一样,因此适用于普通 Go 代码中的相同规则。修改它是安全的,但是如果您同时修改它,那么您需要提供自己的锁定或使用原子类型。
有关完整详细信息,请参阅Go Memory 模型。
如果不安全,为什么不去阻止这种情况?
这与访问 go 例程之间共享的任何其他变量没有什么不同。你可以安全地做,也可以不安全地做——如果你愿意,Go 让你可以自由地用脚射击!
Go 有一个出色的竞争检测器,它可以发现并发变量访问问题。
或者它是否使用了一些安全机械?(比如锁)
不。Go 永远不会为你锁定东西——你需要使用同步包中提供的原语或遵循 Go 的哲学:不要通过共享内存进行通信;相反,通过通信共享内存,即使用通道在 goroutines 之间说话。
- 1 回答
- 0 关注
- 212 浏览
添加回答
举报
0/150
提交
取消