![](https://img-blog.csdnimg.cn/20190918140012416.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
五. Go 并发安全相关
文章平均质量分 87
Go 并发安全相关
苹果香蕉西红柿
这个作者很懒,什么都没留下…
展开
-
go 进阶 sync相关: 七. sync.Map
sync.Map是一个支持并发安全的Map键值对映射表,提供了Store(key, value)插入,Load(key)获取,Delete(key)删除,Range()遍历等方法,了解底层首先要了解内部结构,内部包含了read属性,实际在操作时对应的是一个readOnly可以看为一个只读快照表,每个正在读取的 Goroutine 都会持有一个 readOnly 结构体。原创 2023-05-23 11:26:28 · 1937 阅读 · 0 评论 -
go 进阶 八. 标准库之context
context虽然实现父协程对子协程的管理,但是这种管理方式是比较粗暴的,直接关闭,而且关闭时根本不知道子协程的执行结果。总之,对子协程的管理不够细致化,必要时需要在字协程退出时用defer做下退出处理,或者你可以使用waitGroup这种,对协程的执行结果有个明确的了解注意点:不要把Context放在结构体中,要以参数的方式显示传递以Context作为参数的函数方法,应该把Context作为第一个参数。原创 2023-05-12 09:08:12 · 136 阅读 · 0 评论 -
十三. go 高性能编程之 sync.Once如何提升性能
查看sync.Once底层Once结构体中的done属性: done 在热路径中,done 放在第一个字段,能够减少 CPU 指令,也就是说,这样做能够提升性:热路径(hot path)是程序非常频繁执行的一系列指令,sync.Once 绝大部分场景都会访问 o.done,在热路径上是比较好理解的,如果 hot path 编译后的机器码指令更少,更直接,必然是能够提升性能的。为什么放在第一个字段就能够减少指令呢?原创 2023-05-05 09:15:10 · 157 阅读 · 0 评论 -
十二. go 高性能编程之 sync.Pool的复用对象
【代码】十二. go 高性能编程之 sync.Pool的复用对象。原创 2023-05-05 09:14:50 · 175 阅读 · 0 评论 -
八. go 高性能编程之 读写锁和互斥锁的性能比较
RUnlock 释放读锁。Unlock 释放写锁。原创 2023-05-04 10:07:50 · 270 阅读 · 0 评论 -
go 进阶 sync相关: 六. sync.once 单例
【代码】go 进阶 sync相关: 六. sync.once 单例。原创 2023-04-26 10:26:35 · 133 阅读 · 0 评论 -
go 进阶 sync相关: 五.sync.waitGroup 等待组
waitGroup称为等待组,通过信号量实现groutine的阻塞与继续执行,查看waitGroup源码,内部有两个属性noCopy 用来保证不会被开发者错误拷贝,state1用来保存相关状态量,并且提供了一个私有化的state()方法, 用来处理state1详解state1state1是一个长度为 3 的整型数组,内部分为两部分,state和semap(信号量)原创 2023-04-26 10:26:37 · 243 阅读 · 0 评论 -
go 进阶 sync相关: 四. sync.Cond 同步等待条件
这是因为 notifyList 会有乱序的可能。从我们上面 Wait 的过程可以看出,获取 ticket 和加入 notifyList,是两个独立的行为,中间会把锁释放掉。而当多个 goroutine 同时进行时,中间会产生进行并发操作,那么有可能后获取 ticket 的 goroutine,先插入到 notifyList 里面, 这就会造成 notifyList 轻微的乱序。原创 2023-04-26 10:25:59 · 62 阅读 · 0 评论 -
go 进阶 sync相关: 三. sync.RWMutex 读写锁
sync.RWMutex 读写锁一. 使用示例二. 源码分析1. RLock() 添加读锁2. RUnlock() 释放读锁3. Lock() 添加写锁4. Unlock() 释放写锁三. 小问题总结一. 使用示例func TestRWMutex() { var rwMutex sync.RWMutex sum := 0 for i := 0; i < 10; i++ { go func(t int) { rwMutex.RLock() //time.Sleep(time原创 2023-04-26 10:25:14 · 217 阅读 · 0 评论 -
go 进阶 sync相关: 二. sync.Mutex 互斥锁
Mutex 互斥锁是对共享资源进行访问控制的主要手段,对外暴露两个方法Lock()和Unlock()分别用于加锁和解锁, 查看Mutex源码,内部包含Mutex.state表示互斥锁的状态,比如是否被锁定等。Mutex.sema表示信号量,协程阻塞等待该信号量,解锁的协程释放信号量从而唤醒等待信号量的协程其中state可以理解为有四部分构成:前29位Waiter: 表示阻塞等待锁的协程个数,协程解锁时根据此值来判断是否需要释放信号量。原创 2023-04-26 10:23:22 · 278 阅读 · 0 评论 -
go 进阶 sync相关: 一. sync.atomic 原子操作
【代码】go 进阶 sync相关: 一. sync.atomic 原子操作。原创 2023-04-26 10:23:20 · 143 阅读 · 0 评论