go语言--锁

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

原子锁

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

sema锁

也叫信号量锁/信号锁

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

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

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

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

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

treap 指针指向sudog

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

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

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

sema经常被用作休眠队列

相关推荐
风飘百里16 小时前
分组加密核心原理与实践解析(AES/SM4)
go
岁忧16 小时前
(LeetCode 每日一题) 1865. 找出和为指定值的下标对 (哈希表)
java·c++·算法·leetcode·go·散列表
Wo3Shi4七19 小时前
哈希冲突
数据结构·算法·go
Code季风20 小时前
GORM 部分关键字详解与关联查询实战:Preload 与 Association 的使用对比
go·orm
Code季风20 小时前
深入理解 gRPC 服务定义:从基础到高级
rpc·go
Code季风20 小时前
深入学习 gRPC 流式通信:四种模式详解与实战代码解析
go·grpc
程序员爱钓鱼21 小时前
Go语言泛型-泛型约束与实践
前端·后端·go
程序员爱钓鱼21 小时前
Go语言泛型-泛型对代码结构的优化
后端·google·go
DemonAvenger21 小时前
TCP连接池设计与实现:提升Go应用网络性能
网络协议·架构·go