获得徽章 3
- Go语言标准库中的 sync.Once 可以保证 Go 语言程序运行期间某段代码只会执行一次。
作为用于保证函数执行次数的 sync.Once 结构体,它使用互斥锁和 sync/atomic 包提供的方法实现了某个函数在程序运行期间只能执行一次的语义。
使用该结构体时需要注意以下问题:
sync.Once.Do 方法中传入的函数只会被执行一次,哪怕函数中发生了 panic
两次调用 sync.Once.Do 方法传入不同的函数只会执行第一次调用传入的函数展开赞过评论3 - Go语言标准库中还包含条件变量 sync.Cond,它可以让一组 Goroutine 都在满足特定条件时被唤醒。每一个sync.Cond结构体在初始化时都需要传入一个互斥锁。
sync.Cond不是常用的同步机制,但是在条件长时间无法满足时,与使用for {}进行忙碌等待相比,sync.Cond能够让出处理器的使用权,提高CPU的利用率。展开赞过评论3 - WaitGroup在go语言中,用于线程同步,单从字面意思理解,wait等待的意思,group组、团队的意思,WaitGroup就是指等待一组,等待一个系列执行完成后才会继续向下执行。
WatiGroup是sync包中的一个struct类型,用来收集需要等待执行完成的goroutine。
sync.WaitGroup 对外总共暴露3个方法:
sync.WaitGroup.Add
sync.WaitGroup.Wait
sync.WaitGroup.Done
因 sync.WaitGroup.Done 只是向 sync.WaitGroup.Add 方法中传入了 -1,因此咱们主要分析另外两个方法:sync.WaitGroup.Add 、sync.WaitGroup.Wait
sync.WaitGroup.Add 可以更新 sync.WaitGroup 中的计数器 counter 。
虽然 sync.WaitGroup.Add 方法传入的参数可以为负数,但是计数器只能是非负数,一旦出现负数程序就会崩溃。
当调用的计数器归零,即所有任务都执行完成时,才会通过 runtime_Semrelease 唤醒处于等待状态的 Goroutine。
sync.WaitGroup 的另一个方法 sync.WaitGroup.Wait 会在计数器大于0 并且不存在等待的Goroutine时,调用runtime.sync_runtime_Semacquire 陷入睡眠状态:
当sync.WaitGroup的计数器归零时,陷入睡眠状态的Goroutine会被唤醒,sync.WaitGroup.Wait方法也会立刻放回。展开赞过评论2
, 每天一篇走起来。。。。。