go 的锁是可重入的吗?

**题目来源:**网易

答案1:

不是可重入锁。

讨论这个问题前,先解释一下“重入”这个概念。当一个线程获取到锁时,如果没有其他线程拥有这个锁,那么这个线程就会成功获取到这个锁。线程持有这个锁后,其他线程再请求这个锁,其他线程就会进入阻塞等待的状态。但是如果拥有这个锁的线程再请求这把锁的话,就不会阻塞,而是成功返回,这就是可重入锁。可重入锁也叫做递归锁。

为什么 go 的锁不是可重入锁,因为 Mutex 的实现中,没有记录哪个 goroutine 拥有这把锁。换句话说,我们可以通过 扩展来将 go 的锁变为可重入锁,这里就不展开了。下面是一个误用 Mutex 的重入例子:https://github.com/guowei-gong/go-demo/commit/a6fc236853f5cd0efd4e62269cfe60a19de7a96e