waitgroup

waitgroup比较简单,当add的总数跟done的总数一样,通过信号量唤醒WaitGroup.wait()方法
有兴趣的可以了解下semtable后阅读下源码,挺简单的

type WaitGroup struct {
	noCopy noCopy
	//类似锁,需要注意高32位低32有大小端问题  add总数-wait总数
	state atomic.Uint64 // high 32 bits are counter, low 32 bits are waiter count.
	//存储在semtable上,上文有详细讲解
	sema  uint32
}

SingleFlight

//todo 时间关系未更完有空补充完 SingleFlight主要用于多个并发操作,只执行其中一个,例如多个get操作,防止缓存击穿
主要就是一个map加锁,多个操作通过map只执行一次,通过WaitGroup等待请求的返回

type Group struct {
    mu sync.Mutex       // protects m
    m  map[string]*call // lazily initialized
}
type call struct {
	wg sync.WaitGroup
	val any
	err error
	//累计多少个请求
	dups  int
	chans []chan<- Result
}