正确处理Golang 竞争资源,提高性能
收藏

竞争资源是多个goroutine 在没有相互同步的情况下,访问某个共享的资源,也叫竞态资源。 比如同时对该资源进行读写时,就会处于相互竞争的状态,这就是并发中的资源竞争。对竞争资源处理不当时会有性能损耗,也可能会引起其它问题。

可以用 Race Detector (竞态分析)来找到竞态资源,工具的使用方法就是在go test/build 后加上-race标志

$ go test -v -race
$ go build -race

静态资源有多种同步机制:

  • 使用channel
  • 使用Mutex
  • 使用atomic
  • 使用unsafe.Pointer

性能上 atomic 和 unsafe.Pointer 差不多,Mutex 较慢,channel 最慢。

下面是atomic、unsafe.Pointer、Mutex 的比较结果:

$ go version
go version go1.10 darwin/amd64
$ go test -bench .
goos: darwin
goarch: amd64
BenchmarkPointer-8   	100000000	        12.2 ns/op
BenchmarkValue__-8   	100000000	        14.6 ns/op
BenchmarkRWMutex-8   	 5000000	       302 ns/op

go1.10 后atomic 改变了不少,跟unsafe.Pointer 相差很小。

官方公众号