在使用 Golang 做并发编程的过程中,是开发中必不可少的工具之一,它可以避免多协程对共享资源的并发读写,通过加锁来解决对共享资源的并发控制。

在 Go 语言中提供了互斥锁sync.Mutex{}和读写锁sync.RWMutex{}。他们都实现了sync.Locker接口:

// A Locker represents an object that can be locked and unlocked.
type Locker interface {
    Lock()
    Unlock()
}

在通过调用Lock()获得锁之后,其他协程如果再次调用Lock()获取锁会被阻塞,直到上一个锁被解锁之后才能重新获得锁继续执行,其实这种锁模式就是我们常说的自旋锁,也就是循环加锁,在未获取到锁之前就会一直阻塞,直到加锁成功。