既然并发问题会带来的问题是:原子性破坏,可见性破坏,以及有序性不确定带来的问题。但是我恰好有多个携程对一个全局变量并发写,但是我对读到谁不敏感, 例如:
var a int64
go func() {
// 若干操作
a = 2
}
go func() {} {
// 若干计算
a = 3
}
这个例子我读取到2, 或者3都ok, 因为两个协程都是计算,无非谁先计算出来而已。
那么这种场景下,是不是就不需要考虑对a加锁?
既然并发问题会带来的问题是:原子性破坏,可见性破坏,以及有序性不确定带来的问题。但是我恰好有多个携程对一个全局变量并发写,但是我对读到谁不敏感, 例如:
var a int64
go func() {
// 若干操作
a = 2
}
go func() {} {
// 若干计算
a = 3
}
这个例子我读取到2, 或者3都ok, 因为两个协程都是计算,无非谁先计算出来而已。
那么这种场景下,是不是就不需要考虑对a加锁?
7 回答5.3k 阅读
6 回答6.8k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答3.3k 阅读
2 回答2.2k 阅读
1 回答2.1k 阅读
1 回答1.5k 阅读
不加锁可以用 sync.atomic 。
完全没有同步机制是不行的。
golang spec 没有对原子性做任何假设,所以理论上你可能读到 0 (初始值), 2, 3 以外的值。