go学习笔记
基础
go 定义变量的几种方式
常量的声明
go基本数据类型
go语言中的流程控制
golang中的数组
切片
golang中的map 详解
golang 函数详解
内置函数 panic/recover
golang time包 以及日志函数
golang中的指针
golang 中的结构体
Golang 结构体 和 json互相转换 序列化 反序列化
Golang 中的 go mod 以及 Golang包 详解
golang 中的接口
golang goroutine channel 实现并发 和 并行
channel
goroutine 互斥锁 读写互斥锁
golang 反射
golang 标准库
io
strconv
工具 + blog
进程 线程 协程
空接口 类型断言
为Go项目编写Makefile
减小 Go 代码编译后的二进制体积
go windows下编译linux可执行文件
本文档使用 MrDoc 发布
-
+
首页
goroutine 互斥锁 读写互斥锁
## 互斥锁 互斥锁是传统并发编程中对共享资源进行访问控制的主要手段,它由标准库sync中的Mutex结构体类型表示。sync.Mutex 类型只有两个公开的指针方法,Lock 和 Unlock。Lock锁定当前的共享资源,Unlock 进行解锁。 ``` var conut = 0 var sy sync.WaitGroup var mutex sync.Mutex func test() { mutex.Lock() //上锁 conut++ fmt.Println("输出:", conut) time.Sleep(time.Millisecond * 50) mutex.Unlock() //解锁 sy.Done() } func main() { for i := 0; i <= 20; i++ { sy.Add(1) go test() } sy.Wait() } ``` ## 读写互斥锁 互斥锁的本质是当一个goroutine 访问的时候,其他goroutine都不能访问。这样在资源同步,避免竞争的同时也降低了程序的并发性能。程序由原来的并行执行变成了串行执行。 其实,当我们对一个不会变化的数据只做"读"操作的话,是不存在资源竞争的问题的。因为数据是不变的,不管怎么读取,多少goroutine同时读取,都是可以的。 所以问题不是出在"读"上,主要是修改,也就是"写"。修改的数据要同步,这样其他goroutine才可以感知到。所以真正的互斥应该是读取和修改,修改和修改之前,读和读是没有互斥操作的必要的。 因此,衍生出另一种锁,叫做 读写锁。 读写锁可以让多个读操作并发,同时读取,但是对于写操作是完全互斥的。也就是说,当一个goroutine 进行写操作的时候,其他goroutine既不能进行读操作,也不能进行写操作。 go中的读写锁由结构体类型 sync.RWMutex表示。此类型的方法集合中包含两对方法: 一组是对写操作的锁定和解锁,简称"写锁定" 和 "写解锁": ``` func (*RWMutex)Lock() func (*RWMutex)Unlocl() ``` 另一组表示对读操作的锁定和解锁,简称为"读锁定" 与 "读解锁": ``` func (*RWMutex)Rlock() func (*RWMutex)RUnlock() ```
admin
2022年8月17日 18:42
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码