golang-sync包
文章平均质量分 91
a...Z
golang php rust
展开
-
sync.map
更多好文vx --------- golang技术实验室 ## 案例 package main import ( "fmt" "sync" ) func main(){ var m sync.Map //数据写入 fmt.Println("写入操作") m.Store("name","zhangsan") m.Store("age",23) fmt.Println("读取操作") //数据读取 ok 存在就是true,不村子啊是false name,ok := m.Load(原创 2021-04-26 17:33:04 · 246 阅读 · 0 评论 -
sync.Cond实现原理和使用
更多好文 v golang技术实验室 sync.Cond 1、数据结构 //每个cond有一个相关连的Locker(通常实际一个*Mutex或者*RWMutex),当改变条件或者点用wait方法时 //第一次使用后不可以被复制 // Each Cond has an associated Locker L (often a *Mutex or *RWMutex), // which must be held when changing the condition and // when calling th原创 2021-04-23 17:55:20 · 670 阅读 · 0 评论 -
sync-map
Map 写:直写。 读:先读read,没有再读dirty。 数据结构 type Map struct { // 当涉及到脏数据(dirty)操作时候,需要使用这个锁 mu Mutex // read是一个只读数据结构,包含一个map结构, // 读不需要加锁,只需要通过 atomic 加载最新的指正即可 read atomic.Value // readOnly // dirty 包含部分map的键值对,如果操作需要mutex获取锁原创 2020-11-18 22:39:04 · 132 阅读 · 0 评论 -
pool 减小GC压力的缓存池
pool 总结 pool是用来缓解Gc压力的,会在每次Gc之前全部清空pool,GC默认每两分钟一次 在倒入 pool 包时执行的 init 函数会向 GC 注册 poolCleanup 函数,也就是在 GC 之前会运行该函数。 pool 也存在私有队列为空的时候,从全局队列偷取一部分 noCopy 保证是一个空结构,用来防止pool在第一次使用后被复制 分为本地local 和 global 队列 来绑定P进行操作 poollocal 有pad 来防止false sharding原创 2020-09-29 15:46:41 · 458 阅读 · 0 评论 -
singleflight---防缓存穿透利器
SingleFlight 总结 提供了三个参数Do同步通知、Dochan异步chan通知、Forget删除map的存在的键值 每次调用都会重置map 结构体是由mu sync.Mutex、m map[string]*call组成,mu用于操作的排它锁,m用于存储已有的键值的个数 如果m中存在当前键值对,就会阻塞等待,不存在的时候会加创建call结构存入m中 Dochan会异步执行,将结果放入chan通知其他阻塞的协程 阻塞的协程永的WaitGroup实现 do 的简单使用 package main i原创 2020-09-28 14:34:23 · 1464 阅读 · 0 评论 -
Semaphore 控制有借有还的请求数
Semaphore 信号量是在并发编程中比较常见的一种同步机制,它会保证持有的计数器在 0 到初始化的权重之间,每次获取资源时都会将信号量中的计数器减去对应的数值,在释放时重新加回来,当遇到计数器大于信号量大小时就会进入休眠等待其他进程释放信号,我们常常会在控制访问资源的进程数量时用到。 Golang 的扩展包中就提供了带权重的信号量,我们可以按照不同的权重对资源的访问进行管理,这个包对外也只提供了四个方法: NewWeighted 用于创建新的信号量; Acquire 获取了指定权重的资源,如果当前没有『原创 2020-09-24 16:24:51 · 216 阅读 · 0 评论 -
errGroup-协程出错-通知其他协程
ErrGroup 总结 使用1 package main import ( "errors" "fmt" "golang.org/x/sync/errgroup" ) func main() { group := new(errgroup.Group) nums := []int{-1, 0, 1} for _, num := range nums { tempNum := num // 子协程中若直接访问num,则可能是同一个变量,所以要用临时变量 // 子协程 group原创 2020-09-23 18:04:09 · 851 阅读 · 0 评论 -
Cond-根据特定条件唤醒其他协程
Cond Go 语言在标准库中提供的 Cond 其实是一个条件变量,通过 Cond 我们可以让一系列的 Goroutine 都在触发某个事件或者条件时才被唤醒,每一个 Cond 结构体都包含一个互斥锁 L,我们先来看一下 Cond 是如何使用的: 总结 Cond提供了类似队列FIFO的等待机制,同时也提供Signal唤醒队列最久一个、Broadcast全部唤醒 相比于使用 for {} 忙碌等待,使用 Cond 能够在遇到长时间条件无法满足时将当前处理器让出的功能,如果我们合理使用还是能够在一些情况下提升原创 2020-09-23 14:37:15 · 472 阅读 · 0 评论 -
Once---单例模式
Once 总结 Once只对外提供了do方法 结构体由done uint32和m Mutex组成,done代表执行的次数,m是获取次数(并发读写会影响结果,所以加锁)的时候加锁处理 无论是否执行成功,都会deferatomic.StoreUint32(&o.done, 1) 加1操作 如果当前done是0,则会执行,否则直接返回 Go 语言在标准库的 sync 同步包中还提供了 Once 语义,它的主要功能其实也很好理解,保证在 Go 程序运行期间 Once 对应的某段代码只会执行一次。 在如下原创 2020-09-21 21:51:23 · 267 阅读 · 0 评论 -
WaitGroup
WaitGroup 总结 WaitGroup 提供Add、Wait、done三个方法,Add负责增加计数器,done负责发送信号,然后Add进行减一操作,等到计数器为0的时候会唤醒全部的休眠goroutine Add 不能在和 Wait 方法在 Goroutine 中并发调用,一旦出现就会造成程序崩溃; WaitGroup 必须在 Wait 方法返回之后才能被重新使用; Done 只是对 Add 方法的简单封装,我们可以向 Add 方法传入任意负数(需要保证计数器非负)快速将计数器归零以唤醒其他等待的 G原创 2020-09-21 21:44:07 · 429 阅读 · 0 评论 -
sync.RWMutex
RWMutex 总结 读和写或者释放所得动作都是原子性操作 readerSem — 读写锁释放时通知由于获取读锁等待的 Goroutine; writerSem — 读锁释放时通知由于获取读写锁等待的 Goroutine; w 互斥锁 — 保证写操作之间的互斥; readerCount — 统计当前进行读操作的协程数,触发写锁时会将其减少 rwmutexMaxReaders 阻塞后续的读操作; readerWait — 当前读写锁等待的进行读操作的协程数,在触发 Lock 之后的每次原创 2020-09-17 21:54:14 · 445 阅读 · 0 评论 -
sync.Mutex
-----sync包------ Mutex 总结 Mutex 是最简单的一种锁类型,同时也比较暴力,当一个 goroutine 获得了 Mutex 后,其他 goroutine 就只能乖乖等到这个 goroutine 释放该 Mutex。 互斥锁占用8字节 正常模式,先进先出的队列形式获取锁,饥饿模式是当一个goroutine获取锁的时候,此时的goroutine超过1s没有获取到锁.其他的gorpoutine获取了,这就是饥饿模式,优化是,知乎交给队列的最先的goroutine 饥饿模式原创 2020-09-16 21:59:30 · 1063 阅读 · 0 评论