当前位置: 首页 > news >正文

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

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

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

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

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

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

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

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
http://www.lryc.cn/news/292622.html

相关文章:

  • 聊一聊Tomcat的架构和运行流程,尽量通俗易懂一点
  • ModelArts加速识别,助力新零售电商业务功能的实现
  • Qt/C++音视频开发65-切换声卡/选择音频输出设备/播放到不同的声音设备/声卡下拉框
  • MySQL原理(一)架构组成之逻辑模块(1)组成
  • 一、cadence PDK 自学笔记-心法
  • 防御保护--NAT策略
  • 【C++】C++入门 — 指针空值nullptr
  • Vue3+Koa2实现图片上传(不再畏惧)
  • wsl-ubuntu 安装 nginx
  • 重学Ajax
  • springboot3+vue3支付宝交易案例-结算支付
  • c语言 ceil() 函数
  • virtualBox虚拟机安装ubuntu后的必要配置
  • 《Pandas 简易速速上手小册》第6章:Pandas 时间序列分析(2024 最新版)
  • 滇西科技师范学院食堂大宗物资采购项目(冰冻制品类)招标公告
  • (2024,SaFaRI,双三上采样和 DFT,空间特征和频率特征)基于扩散模型的图像空间和频率感知恢复方法
  • 【Linux】环境基础开发工具的使用之gcc详解(二)
  • go语言-用channel控制goroutine的退出
  • 强大的虚拟机Parallels Desktop 19 mac中文激活
  • 单元测试框架深入(一):单元测试框架深入
  • 苏门X学士常识学习
  • MD5算法:高效安全的数据完整性保障
  • JavaScript基础五对象 内置对象 Math.random()
  • curl之网络接口
  • Pytest中doctests的测试方法应用
  • Android 8.1 铃声音量通话音量同步调节
  • C++——字符串string
  • HBuilder使用[微信小程序开发者工具] 显示 × initialize报错
  • 洛谷P8599 [蓝桥杯 2013 省 B] 带分数
  • grafana安装DevOpsProdigy KubeGraf 1.5.2