大家好,我是煎鱼。 程序里的锁,是很多小伙伴在写分布式应用时用的最多的一个利器之一。 使用 Go 的同学里,绝大部分都有其他语言的经验,就会对其中一点有疑惑,那就是 Go 里的锁,竟然不支持可重入? 为此,今天煎鱼带大家一起来了解这里的设计考量,看看为什么。 可重入锁 如果对已经上锁的普通互斥锁进行 “加锁” 操作,其结果要么失败,要么会阻塞至解锁。 锁的场景如下: 在加锁上:如果是可重入互斥锁,当前尝试加锁的线程如果就是持有该锁的线程时,加锁操作就会成功。 在解锁上:可重入互斥锁一般都会记录被加锁的次数,只有执行相同次数的解锁操作才会真正解锁。 简单来讲,可重入互斥锁是互斥锁的一种,同一线程对其多次加锁不会产生死锁,又或是导致阻塞。 不同语言间实现可能或多或少有些区别,但大体意思差不多。 请你想一下,Go 是怎么样的呢? Go 支持情况 我们看到以下这个 Go 互斥锁例子: var mu sync.Mutex func main() { mu.