遇到Golang的sync.RWMutex的一个坑,同一个协程重复获取读锁导致的死锁为题。

代码如下

var (l sync.RWMutex
)func f1() {l.RLock()defer l.RUnlock()f2()// ...
}func f2() {l.RLock()defer l.RUnlock()// ...
}

大概就是,一个函数里面获取读锁,然后调用另一个函数,另一个函数也去获取读锁,然后还有其他协程获取写锁。结果就出现死锁了。

godoc的说明如下:

If a goroutine holds a RWMutex for reading and another goroutine might call Lock, no goroutine should expect to be able to acquire a read lock until the initial read lock is released. In particular, this prohibits recursive read locking. This is to ensure that the lock eventually becomes available; a blocked Lock call excludes new readers from acquiring the lock.

大意就是,写锁优先级更高,一旦有了写锁的请求,新来的读锁的请求都得排在后面。

于是就会出现这个时序:

1、f1获取到了读锁

2、在调用f2之前其他协程申请写锁

3、f2的读锁请求排在了写锁请求之后

于是死锁了

Golang读写锁读锁重复获取的问题相关推荐

  1. Golang读写锁应用

    读写锁实际是对读写操作进行加锁.需要注意的是多个读操作之间不存在互斥关系,这样提高了对共享资源的访问效率. 先看一个例子: package mainimport ("sync"&q ...

  2. 深入理解读写锁ReentrantReadWriteLock

    深入理解读写锁ReentrantReadWriteLock 前言 业务开发中我们可能涉及到读写操作. 面对写和读,对于数据同步,在使用Lock锁和 synchronized关键字同步数据时候,对于读读 ...

  3. linux库函数pthread.h------pthread_rwlock_t读写锁说明

    读写锁 索引: 初始化一个读写锁pthread_rwlock_init 读锁定读写锁 pthread_rwlock_rdlock 非阻塞读锁定 pthread_rwlock_tryrdlock 写锁定 ...

  4. MySQL读写锁总结

    读写锁 读锁:是一种共享锁,一个事务持有读锁时,不会阻塞其它的读锁,其他事务都可以对该数据进行读取: 写锁:是一种排他锁,一个锁持有写锁会阻塞其他的写锁和读锁,从而保证了一个只有一个事务进行写操作,并 ...

  5. golang:1.并发编程之互斥锁、读写锁详解

    本文转载自junjie,而后稍作修改. 一.互斥锁 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段.它由标准库代码包sync中的Mutex结构体类型代表.sync.Mutex类型(确切地说,是 ...

  6. JAVA读锁不使用效果一样_Java使用读写锁替代同步锁

    应用情景 前一阵有个做反抄袭检测的小伙伴问了我一个问题. --- 在多线程里就是有个变量,我需要读取它来判断是否给它写入一些信息. 打算加锁,但是如果读取时候加入readlock,写入时候加入writ ...

  7. Java多线程学习十七:读锁应该插队吗?什么是读写锁的升降级?

    读锁应该插队吗?以及什么是读写锁的升降级. 读锁插队策略 首先,我们来看一下读锁的插队策略,公平与非公平锁中讲到的 ReentrantLock,如果锁被设置为非公平,那么它是可以在前面线程释放锁的瞬间 ...

  8. Java多线程学习十六:读写锁 ReadWriteLock 获取锁有哪些规则

    读写锁 ReadWriteLock 获取锁有哪些规则呢? 在没有读写锁之前,我们假设使用普通的 ReentrantLock,那么虽然我们保证了线程安全,但是也浪费了一定的资源,因为如果多个读操作同时进 ...

  9. golang中关于读写锁、互斥锁的理解

    锁的概述 为了解决协程同步的问题我们使用了channel,但是GO也提供了传统的同步工具. 它们都在GO的标准库代码包sync和sync/atomic中. 下面我们看一下锁的应用. 什么是锁呢?就是某 ...

最新文章

  1. Python字典基础
  2. MapReduce源码分析之JobSplitWriter
  3. 南陵中学2021高考成绩查询,南陵中学2019高考成绩喜报、一本二本上线情况
  4. 中移动12580领跑世界杯商旅营销
  5. 前端学习(3269):js中this在类中的表现
  6. 前端学习(2873):Vue路由权限『前后端全解析』4递归组件
  7. mysql手动启动1067错误_解决MySQL启动时万恶的1067错误(转)
  8. java hung_java – Hung JVM消耗100%的CPU
  9. plc编程和python的联系_Python与三菱PLC通信
  10. SpringBoot整合IoTDB
  11. python计算单词长度_python – 返回字符串中的单词长度
  12. ckplayer播放线上视频问题
  13. MySQL数据库的索引、事务和存储引擎
  14. 在Linux终端中自定义Bash配色和提示内容
  15. 可以储存照片的字段类型是_在数据库中可用来存储图片的字段对象是哪种类型的字段?...
  16. 小程序转 App 帮助企业打开营销局面
  17. #css 盒子div属性
  18. 歪写数学史(只要真理——罗巴切夫斯基)
  19. 上网本 linux中文版,veket|veket linux上网本操作系统 v5.30 简体中文正式版 - 飞极下载站...
  20. Groovy~Groovy的方法

热门文章

  1. ETCP全国4000家停车场全部支持银联无感支付!
  2. 密码学研究-Provider
  3. excel打开csv文件乱码解决办法
  4. JavaScript空判断
  5. Barsetto百胜图BAV01咖啡机——办公室福利包怎么选?现磨咖啡解君愁
  6. 如何顺时针或者逆时针记录多边形的每个点
  7. 基于python 的股票行情查询系统开发(一)
  8. Java学习笔记(22)Developing Efficient Algorithms
  9. Apache Flink 集成 Apache Hudi 快速入门指南
  10. 【论文泛读】Easing Embedding Learning by Comprehensive Transcription of Heterogeneous Information Networks