贾永琪的技术博客

Go-知识并发控制RWMutex

互斥锁 Mutex 是串行加锁,拿到锁之后,不管是读操作还是写操作,对于 Mutex 来说,是等价的。但是在并发里面,如果仅仅是读操作,不改变数据的前提下,是可以共享的,多个协程读取到的数据都是可信的。写锁需要阻塞写锁: 一个协程拥有写锁时,其他协程写操作需要阻塞写锁需要阻塞读锁: 一个协程拥有写锁时,其他协程读操作需要阻塞读锁需要阻塞写锁: 一个协程拥有读锁时,其他协程写操作需要阻塞读锁不能阻塞读锁: 一个协程拥有读锁时,其他协程读操作不需要阻塞。_go rwmutex

Go-知识并发控制mutex

互斥锁是并发程序中对共享资源进行访问控制的主要手段,Go 语言提供了非常简单易用的 Mutex。Mutex 是结构体类型,对外暴露了 Lock 和 Unlock 两个方法,用于加锁和解锁。自旋对应于CPU的PAUSE指令,CPU对该指令什么都不做,相当于CPU空转,对程序而言相当于sleep了一小段时间,时间非常短,当前实现是 30个时钟周期。自旋过程中会持续探测 Locked 是否变为0 ,连续两次探测奸恶就是在执行这些 PAUSE 指令,不同于sleep,不需要将协程转为睡眠状态。_go mutex

Go-知识并发控制Context

Go 语言的 context 是应用开发常用的并发控制技术,它与 WaitGroup 最大的不同点是 context对于派生 goroutine 有更强的控制力,可以控制多级的 goroutine。context 翻译成中文是 上下文 ,即可以控制一组呈树状结构的 goroutine ,每个 goroutine 拥有相同的上下文。上图中由于 goroutine 派生出子 goroutine ,而子 goroutine 又继续派生出新的 goroutine ,_go并发 context

Go-知识并发控制WaitGroup

WaitGroup 通常用于等待一组“工作协程”结束的场景,其内部维护两个计数器,可以称为“工作协程”计数器和“等待协程”计数器。Add(delta int) 方法用于增加“工作协程”计数,通常在启动新的“工作协程”之前调用。Done 方法用于减少“工作协程”计数,每次调用递减1,通常在“工作协程”内部且在临近返回之前调用。Wait 方法用于增加“等待协程”计数,通常在所有“工作协程”全部启动之后调用。_go waitgroup

Go-知识逃逸分析

栈上分配内存比在堆中分配内存有更高的效率。栈上分配的内存不需要GC处理。对上分配的内存使用完毕会交给GC处理。逃逸分析的目的是决定分配地址是栈还是堆。逃逸分析在编译阶段完成。在编程的时候,应该尽可能避免产生内存逃逸。传递指针可以减少底层值的赋值,可以提高效率,但是如果赋值的数据量小,由于指针传递会产生逃逸,则可能会使用堆,也可能增加GC的负担,所以指针传递不一定是高效的。