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

时间:2013-11-09 06:55:42

标签: thread-safety go closures capture

我刚观察并确认Go闭包通过引用捕获外部变量。如果变量被捕获到Goroutine中并且如果Goroutine复用到不同的线程中,

  • 修改闭包中的值是否安全?
  • 如果不安全,为什么不阻止这种情况?
  • 还是采用了一些安全机制? (如锁)

1 个答案:

答案 0 :(得分:8)

Go会在你注意到的时候通过引用在闭包中捕获外部变量。

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

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

有关详细信息,请参阅The Go Memory model

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

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

Go has an excellent race detector虽然可以找到并发变量访问问题。

还是使用了一些安全机械? (例如锁定)

没有。 Go永远不会为你锁定东西 - 你需要使用sync package中提供的原语或遵循Do not communicate by sharing memory; instead, share memory by communicating的Go哲学,即使用通道在go例程之间说话。