为什么golang不支持可重入锁呢?

为什么golang不需要可重入锁?

在工程中使用锁的原因在于为了保护不变量,也可以用于保护内、外部的不变量。

基于此,Go 在互斥锁设计上会遵守这几个原则。如下:

  • 在调用 mutex.Lock 方法时,要保证这些变量的不变性保持,不会在后续的过程中被破坏。
  • 在调用 mu.Unlock方法时,要保证:
    • 程序不再需要依赖那些不变量。
    • 如果程序在互斥锁加锁期间破坏了它们,则需要确保已经恢复了它们。

以下代码可以看出方法F调用了方法G,两个方法均调用了锁。那么在实际开发工程中就可能存在虽然是同一个goroutine运行,但是在一个方法内很难知道其他方法是否也用了这个锁,用来做什么。那么重入锁在此时便无法保证保护不变量

虽然感觉可以通过IDE找到所有使用地方来进行排查

go 复制代码
func F() {
    mu.Lock()
    ... do some stuff ...
    G()
    ... do some more stuff ...
    mu.Unlock()
}

func G() {
    mu.Lock()
    ... do some stuff ...
    mu.Unlock()
} 

为什么需要可重入锁?

在复杂并发应用中,需要跨多个方法同时持有一个锁。比如说存在两个接口方法A、B,A中调用了B,但是由于这两个方法都可能被其他方法所调用,所以如果没有可重入锁便可能会死锁

比如对于某些面向对象语言,父子类都有同一个带锁方法。还比如递归调用

个人观点

从需要可重入锁的观点来看,我认为应用场景其实并不算广泛。并且golang也不是Java这样的面向对象语言。而其他需要用到的场景,可以通过参数控制是否加锁、或者将递归调用函数提取到新函数中交予新函数加锁、或者采用channel之类的来迂回达成可重入锁的目的。这可能也正是golang的目的------鼓励多使用channel实现目的,以及简单更简单

Ref

  1. https://groups.google.com/g/golang-nuts/c/XqW1qcuZgKg/m/Ui3nQkeLV80J?pli=1
  2. https://www.zhihu.com/question/23284564
相关推荐
Conan在掘金4 分钟前
ArkTS 进阶之道(1):为哈禁 any/unknown?从「编译期就拦」理解鸿蒙严格类型哲学
后端
2401_8949155316 分钟前
Geo优化系统源码部署搭建技术——PHP程序开发部署指南
开发语言·php
找磁材26 分钟前
空心杯电机与永磁体
开发语言·磁性材料·钕铁硼·磁钢
Patrick_Wilson27 分钟前
为什么让程序主动崩溃反而更可靠?聊聊 supervisor 与 let it crash
后端·erlang·elixir
我不管我就要叫小猪35 分钟前
C/C++----命名空间
c语言·开发语言·c++
兮动人1 小时前
Python字符串类型
开发语言·python·python字符串类型
自由随风飘1 小时前
JAVA中的面向对象-3
java·开发语言
小羊先生car1 小时前
RTOS-F429-HAL-(动/静态)任务的创建(2026/7/27)
开发语言·算法·c#
武子康2 小时前
权重已到、Recipe 还在变:Kimi K3 发布后该怎样做工程验收
人工智能·后端·agent
LONGZETECH2 小时前
新能源汽车动力系统仿真硬核拆解:五系统分层架构的设计逻辑与技术权衡
c语言·开发语言·架构·汽车·汽车仿真教学软件·汽车教学软件