go语言 rlock() defer runlock()_Go并发编程之美-读写锁
一、前言
go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CAS、原子变量操作类。相比Java来说go提供了独特的基于通道的同步措施。本节我们先来看看go中读写锁
二、读写锁
go中读写锁,在没有线程获取写锁情况下多个线程可以同时获取读锁,读锁是可重入锁,写锁则是互斥锁(不可重入)。
package mainimport ("fmt""sync""time"
)var (counter int //计数器wg sync.WaitGroup //信号量lock sync.RWMutex //读写锁
)func main() {//1.两个信号wg.Add(1)//2.获取读锁fmt.Println("main thread wait rlock")lock.RLock()fmt.Println("main thread got rlock")//3.开启子线程go incCounter()fmt.Println(counter)time.Sleep(time.Second * 5)//4.释放读锁lock.RUnlock()fmt.Println("main thread release rlock")//5.等待子线程结束wg.Wait()fmt.Println(counter)}func incCounter() {defer wg.Done()//2.1.获取锁fmt.Println("sub thread wait rlock")lock.Lock()fmt.Println("sub thread got rlock")//2.2.计数加1counter++//2.3.释放独占锁lock.Unlock()fmt.Println("sub thread relese rlock")}
- 如上代码go中使用sync.RWMutex可以获取一个开箱即用的读写锁
- 代码(2)主线程使用lock.RLock()获取读锁,然后开启了子线程(代码3),然后在主线程持有读锁的情况下休眠了5s后释放了锁。
- 子线程在代码2.1尝试使用 lock.Lock()获取写锁,由于主线程还没释放读锁,所以子线程阻塞到了这里,直到主线程休眠后执行代码4释放了读锁。
- 执行代码会输出:
main thread wait rlock
main thread got rlock
0
sub thread wait rlock
main thread release rlock
sub thread got rlock
sub thread relese rlock
1
这个例子说明了,当有线程获取了读锁并没释放时候,获取写锁的线程要等待。
另外使用下面方法可以验证读锁是可重入锁:
lock.RLock()lock.RLock()fmt.Println(counter)lock.RUnlock()lock.RUnlock()
使用下面代码可以验证同一个线程的读锁,不能晋升为写锁:
lock.RLock()lock.Lock()fmt.Println(counter)lock.Unlock()lock.RUnlock()
上面代码执行会报错:
image.png
三、总结
go中读写锁中的读锁是可重入共享锁,写锁是互斥锁,读锁不能晋升为写锁。
go语言 rlock() defer runlock()_Go并发编程之美-读写锁相关推荐
- Go并发编程之美-读写锁
一.前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁.CAS.原子变量操作类.相比Java来说go提供了独特的基于通道的同步措施.本节我们先来看 ...
- 【JUC并发编程09】读写锁
文章目录 9 读写锁 9.1 悲观锁和乐观锁 9.2 表锁|行锁|读锁|写锁 9.3 读写锁概述 9.4 读写锁的演变 9.5 锁降级的必要性 9 读写锁 9.1 悲观锁和乐观锁 悲观锁:顾名思义,它 ...
- 《Java并发编程之美》
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yAwEsYPZ-1661534116043)(img/\1625573175405.jpg)] [外链图片转存失败,源站 ...
- java并发编程之美-阅读记录1
1.1什么是线程? 在理解线程之前先要明白什么是进程,因为线程是进程中的一个实体.(线程是不会独立存在的) 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程中的 ...
- 《Java并发编程之美》阅读笔记
简介 最近在阅读<Java并发编程之美>这本书,为了督促自己啃完这本书,计划每读完一章写一篇阅读笔记,供以后参考. 笔记列表 第一部分 Java并发编程基础篇 第1章 并发编程线程基础 第 ...
- Go并发编程之美(三)、互斥锁
go并发编程目录 一.前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁.CAS.原子变量操作类.相比Java来说go提供了独特的基于通道的同步措 ...
- java并发编程之美-阅读记录11
java并发编程实践 11.1ArrayBlockingQueue的使用 有关logback异步日志打印中的ArrayBlockingQueue的使用 1.异步日志打印模型概述 在高并发.高流量并且响 ...
- java并发编程之美-阅读记录2
2.1什么是多线程并发编程 并发:是指在同一时间段内,多个任务同时在执行,并且执行没有结束(同一时间段又包括多个单位时间,也就是说一个cpu执行多个任务) 并行:是指在单位时间内多个任务在同时执行(也 ...
- go语言基础-----18-----协程安全、互斥锁、读写锁、匿名锁、sync.Once
1 线(协)程安全-互斥锁 竞态检查工具是基于运行时代码检查,而不是通过代码静态分析来完成的,可以添加-race 来执行竞态检测.但是对于那些没 有机会运行到的代码逻辑中如果存在安全隐患,即使加了-r ...
最新文章
- 计算机专业期末考试是编程序,计算机专业技能期末考试题
- WEB应用数据验证指南
- java美元兑换,(Java实现) 美元汇率
- 六款小巧的HTTP Server
- 前端能读取压缩包内容吗?_解决前端多环境部署的痛点
- SQL Server中,with as使用介绍
- 笔记本AutoCAD启动时闪退怎么办_戴尔笔记本电脑开不了机如何解决【解决方法】...
- 阿里云 ESSD 采用自研新一代存储网络协议,打造“超级高速”
- 无缓冲channel与容量为1的channel的区别
- [视频访谈翻译]David Kaneda访谈:移动HTML5设计和开发
- element导航菜单添加搜索功能
- 银行与银行之间的现金是如何流转的:央行支付清算系统
- Bibilibili 1024程序员节 CTF 启蒙
- 数学建模方法-灰色预测
- 100G网络升级的路径以及布线方式有哪些?
- free pascal
- 一次脑残的记录: Linux 中实时任务调度与优先级
- PAT乙级1005,用C语言进行编程,继续卡拉兹猜想
- Chrome 浏览器的灵魂插件,盘他!
- Qt--编译安装QWT