并发问题疑问

既然并发问题会带来的问题是:原子性破坏,可见性破坏,以及有序性不确定带来的问题。但是我恰好有多个携程对一个全局变量并发写,但是我对读到谁不敏感, 例如:

var a int64
go func() {
    // 若干操作
    a = 2
}

go func() {} {
    // 若干计算
    a = 3
}

这个例子我读取到2, 或者3都ok, 因为两个协程都是计算,无非谁先计算出来而已。

那么这种场景下,是不是就不需要考虑对a加锁?

阅读 1.8k
2 个回答

不加锁可以用 sync.atomic

完全没有同步机制是不行的。

golang spec 没有对原子性做任何假设,所以理论上你可能读到 0 (初始值), 2, 3 以外的值。

  • a如果有数据竞争,则一定需要加锁,否则行为是未定义的。
  • a如果有竞态条件,在某些场景下或许可以考虑不加锁
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题