TryLock 函数的故事
go1.18 迎来了一个全新的函数
TryLock,开发人员能够以非阻塞的方式获取锁。如果这个锁已经被别的goroutine获取,那么这个函数将会直接返回布尔值false而不是傻傻的等待锁释放。这个新的函数激发了我的好奇心,虽然他的名字很明确,但是它的用途并不明朗,它一般用来干嘛的?
工作流程
mutex 的锁何时会拿不到?
- 当前的锁正在被其他的
goroutine持有。 - 当前的锁没有被持有但是锁正在饥饿模式。锁将交给下一个等待者。
在上述的两种情况下,TryLock 函数将会立即返回 false 。这是一个相当快的操作,因为他只依赖于一位的操作。
如果锁可以拿到,将与 Lock 函数相同的方式获取它并返回此操作结果。如果它不可用,将不会进入自旋,会直接返回false。
TryLock 解决了什么问题?
官方文档中这么说:Note that while correct uses of TryLock do exist, they are rare, and use of TryLock is often a sign of a deeper problem in a particular use of mutexes.
确实,多年来,似乎不需要此功能,甚至不需要解决任何的实际问题。就连官方也没有给出真正的示例。那么这个函数能够给社区带来什么呢?事实上,有很多第三方包都试图实现 TryLock 这样的功能,但是他们都无法完美的和竞争态检查器完美融合。至少,在官方的支持下,适配原生的竞争态检查器变得非常简单。