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

Eon*_*nil 4 closures capture thread-safety go

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

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

Nic*_*ood 9

正如您所注意到的,Go会通过引用在闭包中捕获外部变量.

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

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

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

如果它不安全,为什么不去防止这个?

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

Go有一个出色的竞赛检测器,虽然可以找到并发的变量访问问题.

还是采用了一些安全机械?(如锁)

不,Go永远不会为您锁定东西 - 您需要使用同步包中提供的原语,或遵循Go的理念,即不通过共享内存进行通信; 相反,通过通信共享内存,即使用通道在go例程之间说话.