7. go并发:同步原语,用sync包控制并发
go在并发的时候,可能会出现多个协程同时访问一个资源的时候,这就出现了资源竞争。也可能出现协程还在运行,但是主程序却退出了的情况,这是缺少控制导致的。 用sync包,可以方便的控制资源的访问,也可以方便实现阻塞等待,让协程执行完毕再退出程序,或者执行下一步。 资源竞争 在同一个goroutine中,如果分配的内存没有被其他的goroutine访问,只在该goroutine中使用,则不存在资源竞争问题 如果同一块内存被多个goroutine同时访问,就会产生不知道谁先访问,也无法预料最后结果的情况,这就是资源竞争: // 共享的资源 var sum = 0 func main(){ for i := 0; i < 100; i++ { go add(10) } // goroutine 不会阻塞下面的代码,此处Sleep一下,防止main goroutine直接退出 // 而导致未完成的goroutine也被终止 time.Sleep(time.Second * 2) fmt.Println("Sum is:", sum) } func add(i int) { sum += i } 上述例子中,sum变量为共享的资源,程序运行的过程中会发生资源竞争。 使用 go build、go run、go test 这些 Go 语言工具链提供的命令时,添加 -race 标识可以帮你检查 Go 语言代码是否存在资源竞争 同步原语 sync....