sync作为Golang中的标准库,承担了golang中的基础锁的实现,包中的sync.Mutex和sync.RWMutex都实现了Locker接口。
抽象接口--Locker
Locker作为sync中的抽象接口,其主要意义就在于统一go项目中的锁,不同包中的锁针对实际场景实现利用不同的数据结构实现相同的接口,利用官方的Locker接口将锁在包项目中进行传递,所以官方贴心的只做了两个方法:
- Lock()
- Unlock ()
这也符合go所声明的薄耦合的思想,同时实现官方的Locker接口也利于项目整体风格的统一,例如在项目初期可以使用官方提供的简单互斥锁:
var locker *sync.Mutex
func main(){
lock(lcoker)
}
func lock(lock sync.Locker){
}
后期可以更换成:
var locker *CreateLock
func main(){
lock(locker)
}
func lock(lock sync.Locker){
}
不少利用Go写的开源项目中的锁同样实现了官方的Locker接口,并拓展了自己的功能,例如图中的etcd.concurrency包,