go语言--锁

锁的基础,go的锁是构建在原子操作和信号锁之上的

原子锁

原子包实现协程的对同一个数据的操作,可以实现原子操作,只能用于简单变量的简单操作,可以把多个操作变成一个操作

sema锁

也叫信号量锁/信号锁

核心是一个uint32值,含义是同时可并发的数量

每一个sema 锁都对应一个SemaRoot结构体

SemaRoot中有一个平衡二又树用于协程排队

获取锁: uint32减一,获取成功

释放锁: uint32加一,释放成功

treap 指针指向sudog

如果uint32为0 获取锁: 协程gopark休眠,进入堆树等待

释放锁: 从堆树中取出一个协程,唤醒

sema锁退化成一个专用休眠队列

sema经常被用作休眠队列

相关推荐
王码码20352 天前
Go语言中的数据库操作:从sqlx到ORM
后端·golang·go·接口
小羊在睡觉2 天前
Go与MySQL锁:高并发开发实战指南
数据库·后端·mysql·go
先跑起来再说2 天前
Gin 从入门到实践:路由与 Context 深入解析
go·gin
小羊在睡觉3 天前
Reids缓存穿透、击穿、雪崩
redis·缓存·go
@atweiwei4 天前
深入解析gRPC服务发现机制
微服务·云原生·rpc·go·服务发现·consul
Mgx5 天前
我在 Mac 写了个服务,硬要它在 18 岁高龄的 Windows 服务器上跑,结果…
go
少林码僧5 天前
1.1 一个架构师竟然这样设计通知平台,解决了所有业务方的痛点!
go
少林码僧5 天前
1.2 太震撼了!多渠道消息适配只用一个设计模式就搞定了?
go
咬_咬5 天前
go语言学习(环境安装,第一个go程序)
开发语言·学习·golang·go·goland
人间打气筒(Ada)6 天前
「码动四季·开源同行」golang:负载均衡如何提高系统可用性?
算法·golang·开源·go·负载均衡·负载均衡算法