返回

Go 1.18 新特性:折腾 N 次的 TryLock 终于有回应

后端

Go 1.18 新特性:折腾 N 次的 TryLock 终于有回应

大家好,我是煎鱼。还记得我之前写过一篇《Go 为什么不支持可重入锁?》的文章,主要是介绍有其他语言经验的小伙伴,想要 Go 支持可重入锁,被残忍拒绝的历程。大佬总会有拗不过的时候,虽然不是可重入锁,但在 Go 1.18 中,终于迎来了 sync.Mutex.TryLock() 函数,也就是我们俗称的尝试加锁。

什么是 TryLock?

sync.Mutex.TryLock() 函数允许我们在不阻塞的情况下尝试获取锁。如果锁当前可用,则该函数将立即返回 true,并且调用者已成功获取锁。如果锁当前不可用,则该函数将立即返回 false,并且调用者将不会被阻塞。

为什么要使用 TryLock?

在某些情况下,使用 TryLock() 函数可以提高并发性能。例如,当我们有一个临界区,并且我们知道该临界区在大多数情况下都是可用的,那么我们就可以使用 TryLock() 函数来尝试获取锁。如果我们能够成功获取锁,那么我们就无需等待,并且可以立即执行临界区中的代码。如果我们无法成功获取锁,那么我们就可以执行其他任务,而无需等待锁释放。

TryLock 的使用示例

package main

import (
    "fmt"
    "sync"
)

var mu sync.Mutex

func main() {
    if mu.TryLock() {
        fmt.Println("成功获取锁")
        mu.Unlock()
    } else {
        fmt.Println("无法获取锁")
    }
}

在上面的示例中,我们使用 TryLock() 函数来尝试获取锁。如果我们能够成功获取锁,那么我们就输出“成功获取锁”的字符串,并且立即释放锁。如果我们无法成功获取锁,那么我们就输出“无法获取锁”的字符串。

TryLock 的注意事项

在使用 TryLock() 函数时,需要注意以下几点:

  • TryLock() 函数只能用于 sync.Mutex 类型。
  • TryLock() 函数不会阻塞,因此它不会导致死锁。
  • TryLock() 函数的返回值是一个 bool 值,如果返回 true,则表示成功获取锁,如果返回 false,则表示无法获取锁。
  • TryLock() 函数只能在同一个 goroutine 中使用。

总结

sync.Mutex.TryLock() 函数是一个非常有用的新特性,它可以帮助我们提高并发性能。在某些情况下,使用 TryLock() 函数可以避免死锁,并且可以提高代码的可读性和可维护性。