如果两个或者多个 goroutine 在没有互相同步的情况下,访问某个共享的资源,并试图同时读和写这个资源,就处于相互竞争的状态。这种情况被称作竞争状态。要想解决竞争状态,对一个共享资源的读和写操作必须是原子化的。也就是说,同一时刻只能有一个 goroutine 对共享资源进行读和写操作。
可见代码为:
package main
import (
"fmt"
"runtime"
"sync"
)
var counter int
var wg sync.WaitGroup
func main() {
runtime.GOMAXPROCS(1)
wg.Add(2)
go incCounter(1)
go incCounter(2)
fmt.Println("waiting to finish")
wg.Wait()
fmt.Println("final counter:",counter)
}
func incCounter(id int) {
defer wg.Done()
for count := 0; count < 2; count++{
value := counter
// 当前 goroutine 从线程退出,并放回队列
runtime.Gosched()
value++
counter = value
}
}
其运行的结果为:
其 goroutine 调度图为:
对于go 程序,可以使用命令
go build -race // 使用竞争检测器标志来编译程序