简介

互斥锁本质是当一个协程访问的时候,其他协程都不能访问.
其实主要是想:修改数据要同步,这样其他协程才可以感知到,所以真正的互斥应该是读取和修改,修改和修改之间,读和读是没有互斥操作的必要的

读写锁可以让多个读并发,但是对于写是互斥的.
当一个协程在写的时候,其他协程不能读也不能写
同时只能存在写锁定或读锁定(读和写互斥)

go中的读写锁由结构类型sync.RWMutex表示.这个类型的方法集合中包含两对方法
一组是对写操作的锁定和解锁,简称:写锁定和写解锁

func (*RWMutex) Lock()
func (*RWMutex) UnLock()

另一组表示对读操作的锁定和解锁,简称为读锁定和读解锁

func (*RWMutex) RLock()
func (*RWMutex) RUlock()

读时共享,写时独占.
写优先级比读高

读锁也算个锁,锁只能有一把

package mainimport ("fmt""sync"
)func main() {var mutex sync.Mutexfmt.Printf("%+v\n", mutex)mutex.Lock()fmt.Printf("%+v\n", mutex)mutex.Unlock()fmt.Printf("%+v\n", mutex)
}

输出

{state:0 sema:0}
{state:1 sema:0}
{state:0 sema:0}

可以看出当Lock()时,state为1,Unlock()时,state为0。

使用

读写锁,最好不要和channel一起使用会造成死锁

//创建读写锁
var mx sync.RWMutex//读
func readGo(in <-chan int, idx int) {for {//mx.RLock() //读锁//要求写端同时在线,自己阻塞num := <-infmt.Println("读取: ", num, idx)time.Sleep(time.Millisecond * 300) //放大实验现象//mx.RUnlock()}}//写
func writeGo(out chan<- int, idx int) {for {//生成随机数num := rand.Intn(1000)mx.Lock() //写锁out <- numfmt.Println("------写入: ", num, idx)time.Sleep(time.Millisecond * 30) //放大实验现象mx.Unlock()}
}func main() {//播种随机数rand.Seed(time.Now().UnixNano())ch := make(chan int) //数据传递的channelfor i := 0; i < 5; i++ {go writeGo(ch, i+1)}for i := 0; i < 5; i++ {go readGo(ch, i+1)}for {;}}

全局变量数据同步

//创建读写锁
var mx sync.RWMutex
var i int  //全局变量模拟共享数据//读
func readGo(idx int) {for {mx.RLock() //读锁num := ifmt.Println("读取: ", num, idx)//time.Sleep(time.Millisecond * 30) //放大实验现象mx.RUnlock()}}//写
func writeGo(idx int) {for {mx.Lock() //写锁//生成随机数num := rand.Intn(1000)i = numfmt.Println("------写入: ", num, idx)time.Sleep(time.Millisecond * 30) //放大实验现象mx.Unlock()}
}func main() {//播种随机数rand.Seed(time.Now().UnixNano())for i := 0; i < 5; i++ {   //5个读过程go readGo(i+1)}for i := 0; i < 5; i++ {   //5个写过程go writeGo(i+1)}for {;}
}

golang中的读写锁相关推荐

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

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

  2. MongoDB中的读写锁

    1. MongoDB 使用的锁 MongoDB 使用的是"readers-writer"锁, 可以支持并发但有很大的局限性 当一个读锁存在,许多读操作可以使用这把锁,然而, 当一个 ...

  3. Java中的读/写锁

    原文链接 作者:Jakob Jenkov 译者:微凉 校对:丁一 相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些.假设你的程序中涉及到对一些共享资源的读和写操作,且写 ...

  4. go中的读写锁RWMutex

    转自:http://studygolang.com/articles/3027 读写锁是针对于读写操作的互斥锁. 基本遵循两大原则: 1.可以随便读.多个goroutin同时读. 2.写的时候,啥都不 ...

  5. Gox语言中使用读写锁解决并发冲突以及如何实现线程同步归并-GX22

    Gox语言中,除了可以直接使用Go语言中的通道对象(chan)之外,也直接引入了Go语言标准库中的sync包,因此可以直接使用共享锁Mutex对象或者读写锁RWMutex对象来处理并发操作中共享数据安 ...

  6. java 读写锁_Java中的读写锁

    一.读写锁 1.初识读写锁 a)Java中的锁--Lock和synchronized中介绍的ReentrantLock和synchronized基本上都是排它锁,意味着这些锁在同一时刻只允许一个线程进 ...

  7. Mysql中的读写锁,表锁和行锁,间隙锁

    Mysql数据库锁 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的 ...

  8. PHP程序中的文件锁、互斥锁、读写锁使用技巧解析

    文件锁全名叫 advisory file lock, 书中有提及. 这类锁比较常见,例如 mysql, php-fpm 启动之后都会有一个pid文件记录了进程id,这个文件就是文件锁. 这个锁可以防止 ...

  9. ReentrantReadWriteLock读写锁及其在 RxCache 中的使用

    一. ReentrantReadWriteLock读写锁 Lock 是相当于 synchronized 更面向对象的同步方式,ReentrantLock 是 Lock 的实现. 本文要介绍的 Reen ...

最新文章

  1. [LintCode] Maximum Subarray 最大子数组
  2. BlueTooth: 蓝牙基础知识进阶——链路控制操作
  3. mysql show tables_mysql — show tables的结果不一定准确 | 学步园
  4. latex使用小记录
  5. bootstrapTable基础操作
  6. 前端图片有时候能显示有时候不显示_web前端基础教程:两种数据存储思路
  7. 贪心算法——洛谷(P1478)陶陶摘苹果
  8. php笔试有多少分钟,PHP研发工程师笔试题(半小时)
  9. 一个员工经常找别人聊天,吾就知道他要走人了
  10. 双击ctrl搜索 意在颠覆用户的习惯
  11. 最新黑马java十次方社交项目教程
  12. 【nvidia npp】——图像resize
  13. 如何理解泊松分布(Poisson Distribution)
  14. 还用老套路分析财务数据?这3种财务分析方法,你一定得看看
  15. matlab Sellmeier拟合,rcwa 关于严格耦合波发分析光栅等的相关matlab仿真 275万源代码下载- www.pudn.com...
  16. 【qt开发】qt了解
  17. 2022-2028全球气动吸尘器行业调研及趋势分析报告
  18. 【单片机毕业设计】【mcuclub-jj-006】基于单片机的指纹电子密码锁的设计
  19. 工业控制领域电子元件国产化硬件设计替代解读
  20. Arduino之Arduino UNO数据手册

热门文章

  1. 【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt )
  2. fastjson反序列化多层嵌套泛型类与java中的Type类型
  3. grid - 使用相同的名称命名网格线和设置网格项目位置
  4. android设备局域网中快速搜索之cling方式
  5. Ext JS 6学习文档-第3章-基础组件
  6. 由c#的值类型与引用类型说开去
  7. debian 升级glibc
  8. [整理] C#调用SQLDMO.DLL时间数据库备份 / 还原。 (香神无涯) // C#实现SQLSERVER2000数据库备份还原的两种方法 (带进度条)...
  9. 帝国CMS的phomenewspic/ecmsinfo标签详解
  10. 二、创作网站 (三) Creating custom content types