一、前言

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并发编程之美-读写锁相关推荐

  1. Go并发编程之美-读写锁

    一.前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁.CAS.原子变量操作类.相比Java来说go提供了独特的基于通道的同步措施.本节我们先来看 ...

  2. 【JUC并发编程09】读写锁

    文章目录 9 读写锁 9.1 悲观锁和乐观锁 9.2 表锁|行锁|读锁|写锁 9.3 读写锁概述 9.4 读写锁的演变 9.5 锁降级的必要性 9 读写锁 9.1 悲观锁和乐观锁 悲观锁:顾名思义,它 ...

  3. 《Java并发编程之美》

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yAwEsYPZ-1661534116043)(img/\1625573175405.jpg)] [外链图片转存失败,源站 ...

  4. java并发编程之美-阅读记录1

    1.1什么是线程? 在理解线程之前先要明白什么是进程,因为线程是进程中的一个实体.(线程是不会独立存在的) 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程中的 ...

  5. 《Java并发编程之美》阅读笔记

    简介 最近在阅读<Java并发编程之美>这本书,为了督促自己啃完这本书,计划每读完一章写一篇阅读笔记,供以后参考. 笔记列表 第一部分 Java并发编程基础篇 第1章 并发编程线程基础 第 ...

  6. Go并发编程之美(三)、互斥锁

    go并发编程目录 一.前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁.CAS.原子变量操作类.相比Java来说go提供了独特的基于通道的同步措 ...

  7. java并发编程之美-阅读记录11

    java并发编程实践 11.1ArrayBlockingQueue的使用 有关logback异步日志打印中的ArrayBlockingQueue的使用 1.异步日志打印模型概述 在高并发.高流量并且响 ...

  8. java并发编程之美-阅读记录2

    2.1什么是多线程并发编程 并发:是指在同一时间段内,多个任务同时在执行,并且执行没有结束(同一时间段又包括多个单位时间,也就是说一个cpu执行多个任务) 并行:是指在单位时间内多个任务在同时执行(也 ...

  9. go语言基础-----18-----协程安全、互斥锁、读写锁、匿名锁、sync.Once

    1 线(协)程安全-互斥锁 竞态检查工具是基于运行时代码检查,而不是通过代码静态分析来完成的,可以添加-race 来执行竞态检测.但是对于那些没 有机会运行到的代码逻辑中如果存在安全隐患,即使加了-r ...

最新文章

  1. 计算机专业期末考试是编程序,计算机专业技能期末考试题
  2. WEB应用数据验证指南
  3. java美元兑换,(Java实现) 美元汇率
  4. 六款小巧的HTTP Server
  5. 前端能读取压缩包内容吗?_解决前端多环境部署的痛点
  6. SQL Server中,with as使用介绍
  7. 笔记本AutoCAD启动时闪退怎么办_戴尔笔记本电脑开不了机如何解决【解决方法】...
  8. 阿里云 ESSD 采用自研新一代存储网络协议,打造“超级高速”
  9. 无缓冲channel与容量为1的channel的区别
  10. [视频访谈翻译]David Kaneda访谈:移动HTML5设计和开发
  11. element导航菜单添加搜索功能
  12. 银行与银行之间的现金是如何流转的:央行支付清算系统
  13. Bibilibili 1024程序员节 CTF 启蒙
  14. 数学建模方法-灰色预测
  15. 100G网络升级的路径以及布线方式有哪些?
  16. free pascal
  17. 一次脑残的记录: Linux 中实时任务调度与优先级
  18. PAT乙级1005,用C语言进行编程,继续卡拉兹猜想
  19. Chrome 浏览器的灵魂插件,盘他!
  20. Qt--编译安装QWT

热门文章

  1. saltstack二次开发构建自己的api
  2. 《Adobe Photoshop CC经典教程》—第1课1.2节使用工具
  3. 【双11背后的技术】集团AliDocker化双11总结
  4. UVa 11624,两次BFS
  5. 与应用程序松耦合的报表开发组织
  6. 测试字符串读取类: TStringReader
  7. ON REG EXPRESSION.SYNTAX
  8. c#.net常用的小函数和方法集
  9. Spark的Yarn模式及其案例
  10. Spring的一些资源