锁是一种并发编程中的同步原语(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.goonly once
