在使用 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()
获取锁会被阻塞,直到上一个锁被解锁之后才能重新获得锁继续执行,其实这种锁模式就是我们常说的自旋锁
,也就是循环加锁,在未获取到锁之前就会一直阻塞,直到加锁成功。