什么情况下需要用到互斥锁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

你这个程序死锁了啊。

# 0

stevewang

需要在多个goroutine下读和写的数据就需要同步保护,可以用sync.Mutex,对于简单数据也可以用sync/atomic提供的原子操作。

# 1

zweite

你可以试下酱紫运行

GOMAXPROCS=4 go run main.go

就会和你说的结果不一样的.这个是因为你的golang配置默认为一个线程去跑你所有的goroutine,你所有的goroutine是排队执行的,故你看到输出的是1 2 3.但是如果你设置为多线程执行的时候,那么这样的结果就不一定了,这个时候就需要加上同步锁.才能保证所有的goroutine有序的访问数据

=================================================

好整齐的分割线~~~

补充说明,golang中的++为非原子性操作

# 2