有个场景是这样,两个goroutine共同操作一个全局变量。
一个写,另一个读。
这种情况下如果不加读写锁的话,安全吗?
我以为是不安全的。但是写了个示例代码,不加锁的,发现程序并不会挂掉。
为啥?
示例代码是:
```
package main
import (
//"sync"
"math/rand"
"runtime"
"time"
)
type Tmp struct {
a int
b string
c float64
}
var g Tmp
func main() {
runtime.GOMAXPROCS(4)
go func() {
for {
g = Tmp{rand.Intn(100), "123", rand.Float64()}
println("set", g.a)
}
}()
go func() {
for {
println("get", g.c)
}
}()
for {
time.Sleep(30 * time.Second)
}
}
```
示例代码来自:
https://github.com/aszxqw/practice/blob/master/go/rwmutex/main.go
Hello。
g = Tmp{rand.Intn(100), "123", rand.Float64()}
上面这行代码,当你进行赋值的时候,在计算机的底层要分成好几步,对吧。如果g还没有开辟空间,正好进行了读操作,这个时候就可能crash了。我这么说,你能明白吗?发生这种情况,在测试情况下,出现就是低概率事件,所以对于考虑你的代码,你应该考虑的更多的是原子操作的问题,如果上述代码整个是一个原子操作,就不会有任何问题了,对吧。
#4
更多评论