锁是一种并发编程中的同步原语(Synchronization Primitives),它能保证多个goroutine在访问同一片内存时不会出现竞争条件(Race condition)等问题。
互斥锁 Mutex
读写互斥锁 RWMutex
是粒度更细的互斥锁,它不限制资源的并发读,但是读写、写写操作无法并行执行。能够在读操作远远多于写操作时提升性能。
WaitGroup
可以等待一组goroutine的返回,一个比较常见的使用场景是批量发出RPC或者HTTP请求
requests := []*Request{...}
wg := &sync.WaitGroup{}
wg.Add(len(requests))
for _, request := range requests {
go func(r *Request) {
defer wg.Done()
// res, err := service.call(r)
}(request)
}
wg.Wait()
Once
sync.Once可以保证在Go程序运行期间的某段代码只会执行一次。
func main() {
o := &sync.Once{}
for i := 0; i < 10; i++ {
o.Do(func() {
fmt.Println("only once")
})
}
}
$ go run main.go
only once