什么情况下需要用到互斥锁sync.Mutex?
如果是基本类型的变量,在并发情况下访问需要锁么?我测试了一下,输出的是1 2 3,貌似不用锁? 那什么情况下需要锁呢?
package main
import (
"fmt"
)
var a int
func main() {
ch := make(chan int)
go foo()
go foo()
go foo()
<-ch
}
func foo() {
a++
fmt.Println(a)
}
共 3 个回复
stevewang
你这个程序死锁了啊。
stevewang
需要在多个goroutine下读和写的数据就需要同步保护,可以用sync.Mutex,对于简单数据也可以用sync/atomic提供的原子操作。
zweite
你可以试下酱紫运行
GOMAXPROCS=4 go run main.go
就会和你说的结果不一样的.这个是因为你的golang配置默认为一个线程去跑你所有的goroutine,你所有的goroutine是排队执行的,故你看到输出的是1 2 3.但是如果你设置为多线程执行的时候,那么这样的结果就不一定了,这个时候就需要加上同步锁.才能保证所有的goroutine有序的访问数据
=================================================
好整齐的分割线~~~
补充说明,golang中的++为非原子性操作