Go: 关于锁(mutex)的正确使用姿势

实现 tryLock 功能

一般 Lock()
如果拿不到锁的话,会一直阻塞在那里,在某些场景下这个功能不是我们所期望的结果,我们可能希望程序在一定时间内无法获取到锁的话就做其他操作或者直接返回失败:比如在一个 http server 中,处理请求时因为锁等待时间太长导致客户端大量超时,引发客户端重连以及服务端 goroutine 数量持续增长(虽然客户端超时了,但是处理请求的 goroutine 还在继续处理已超时的请求并且阻塞在了获取锁的地方,然后客户端重连又加重了这个问题,表现就是处理请求的 goroutine 数量直线上升)。这个时候我们就需要有一个类似 tryLock 的功能,在发现短时间内无法获取到锁的时候直接返回失败的响应,防止问题进一步加重(Fail Fast)。

关于 tryLock 这个功能的介绍可以参考 Java 中 tryLock
的介绍,至于 Go 中如何实现 tryLock 可以参考 为 Go Mutex 实现 TryLock 方法 | 鸟窝