有个场景是这样,两个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
读写是独立没有问题的,同时写才有不同步的问题,上面的代码有几个问题:
1. for里需要使用Gosched让出时间片
2. 最后的for使的程序根本不会停下来
并发的情况一般建议先考虑chan,再考虑sync
```golang
package main
import (
"fmt"
"math/rand"
"runtime"
"time"
)
type Tmp struct {
a int
b string
c float64
}
var g Tmp
func main() {
runtime.GOMAXPROCS(4)
rand.Seed(time.Now().Unix())
g = Tmp{rand.Intn(100), "123", rand.Float64()}
go func() {
for {
g.c = rand.Float64()
fmt.Println("set", g.c)
runtime.Gosched()
}
}()
go func() {
for {
fmt.Println("get", g.c)
runtime.Gosched()
}
}()
time.Sleep(30 * time.Second)
}
```
#3
更多评论