`TryLock` 函数的故事

218 阅读1分钟

TryLock 函数的故事

go1.18 迎来了一个全新的函数 TryLock ,开发人员能够以非阻塞的方式获取锁。如果这个锁已经被别的 goroutine 获取,那么这个函数将会直接返回布尔值 false 而不是傻傻的等待锁释放。

这个新的函数激发了我的好奇心,虽然他的名字很明确,但是它的用途并不明朗,它一般用来干嘛的?

工作流程

mutex 的锁何时会拿不到?

  • 当前的锁正在被其他的 goroutine 持有。
  • 当前的锁没有被持有但是锁正在饥饿模式。锁将交给下一个等待者。

tryLock.png

在上述的两种情况下,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 这样的功能,但是他们都无法完美的和竞争态检查器完美融合。至少,在官方的支持下,适配原生的竞争态检查器变得非常简单。