Golang读写锁读锁重复获取的问题
遇到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读写锁读锁重复获取的问题相关推荐
- Golang读写锁应用
读写锁实际是对读写操作进行加锁.需要注意的是多个读操作之间不存在互斥关系,这样提高了对共享资源的访问效率. 先看一个例子: package mainimport ("sync"&q ...
- 深入理解读写锁ReentrantReadWriteLock
深入理解读写锁ReentrantReadWriteLock 前言 业务开发中我们可能涉及到读写操作. 面对写和读,对于数据同步,在使用Lock锁和 synchronized关键字同步数据时候,对于读读 ...
- linux库函数pthread.h------pthread_rwlock_t读写锁说明
读写锁 索引: 初始化一个读写锁pthread_rwlock_init 读锁定读写锁 pthread_rwlock_rdlock 非阻塞读锁定 pthread_rwlock_tryrdlock 写锁定 ...
- MySQL读写锁总结
读写锁 读锁:是一种共享锁,一个事务持有读锁时,不会阻塞其它的读锁,其他事务都可以对该数据进行读取: 写锁:是一种排他锁,一个锁持有写锁会阻塞其他的写锁和读锁,从而保证了一个只有一个事务进行写操作,并 ...
- golang:1.并发编程之互斥锁、读写锁详解
本文转载自junjie,而后稍作修改. 一.互斥锁 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段.它由标准库代码包sync中的Mutex结构体类型代表.sync.Mutex类型(确切地说,是 ...
- JAVA读锁不使用效果一样_Java使用读写锁替代同步锁
应用情景 前一阵有个做反抄袭检测的小伙伴问了我一个问题. --- 在多线程里就是有个变量,我需要读取它来判断是否给它写入一些信息. 打算加锁,但是如果读取时候加入readlock,写入时候加入writ ...
- Java多线程学习十七:读锁应该插队吗?什么是读写锁的升降级?
读锁应该插队吗?以及什么是读写锁的升降级. 读锁插队策略 首先,我们来看一下读锁的插队策略,公平与非公平锁中讲到的 ReentrantLock,如果锁被设置为非公平,那么它是可以在前面线程释放锁的瞬间 ...
- Java多线程学习十六:读写锁 ReadWriteLock 获取锁有哪些规则
读写锁 ReadWriteLock 获取锁有哪些规则呢? 在没有读写锁之前,我们假设使用普通的 ReentrantLock,那么虽然我们保证了线程安全,但是也浪费了一定的资源,因为如果多个读操作同时进 ...
- golang中关于读写锁、互斥锁的理解
锁的概述 为了解决协程同步的问题我们使用了channel,但是GO也提供了传统的同步工具. 它们都在GO的标准库代码包sync和sync/atomic中. 下面我们看一下锁的应用. 什么是锁呢?就是某 ...
最新文章
- Python字典基础
- MapReduce源码分析之JobSplitWriter
- 南陵中学2021高考成绩查询,南陵中学2019高考成绩喜报、一本二本上线情况
- 中移动12580领跑世界杯商旅营销
- 前端学习(3269):js中this在类中的表现
- 前端学习(2873):Vue路由权限『前后端全解析』4递归组件
- mysql手动启动1067错误_解决MySQL启动时万恶的1067错误(转)
- java hung_java – Hung JVM消耗100%的CPU
- plc编程和python的联系_Python与三菱PLC通信
- SpringBoot整合IoTDB
- python计算单词长度_python – 返回字符串中的单词长度
- ckplayer播放线上视频问题
- MySQL数据库的索引、事务和存储引擎
- 在Linux终端中自定义Bash配色和提示内容
- 可以储存照片的字段类型是_在数据库中可用来存储图片的字段对象是哪种类型的字段?...
- 小程序转 App 帮助企业打开营销局面
- #css 盒子div属性
- 歪写数学史(只要真理——罗巴切夫斯基)
- 上网本 linux中文版,veket|veket linux上网本操作系统 v5.30 简体中文正式版 - 飞极下载站...
- Groovy~Groovy的方法
热门文章
- ETCP全国4000家停车场全部支持银联无感支付!
- 密码学研究-Provider
- excel打开csv文件乱码解决办法
- JavaScript空判断
- Barsetto百胜图BAV01咖啡机——办公室福利包怎么选?现磨咖啡解君愁
- 如何顺时针或者逆时针记录多边形的每个点
- 基于python 的股票行情查询系统开发(一)
- Java学习笔记(22)Developing Efficient Algorithms
- Apache Flink 集成 Apache Hudi 快速入门指南
- 【论文泛读】Easing Embedding Learning by Comprehensive Transcription of Heterogeneous Information Networks