go sync.once用法
Posted sunansheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go sync.once用法相关的知识,希望对你有一定的参考价值。
作用
sync.once可以控制函数只能被调用一次。不能多次重复调用。
示例代码:
package main
import (
"fmt"
"sync"
)
func main()
o := &sync.Once
var wa sync.WaitGroup
wa.Add(2)
go do(o,&wa)
go do(o,&wa)
wa.Wait()
func do(o *sync.Once, wa *sync.WaitGroup)
fmt.Println("Start do")
o.Do(func()
fmt.Println("Doing something...")
)
fmt.Println("Do end")
wa.Done()
输出结果:
Start do
Doing something...
Do end
Start do
Do end
这里 Doing something 只被调用了一次。
代码实现
查看go once的源码实现,也是非常的简单:
type Once struct
m Mutex
done uint32
func (o *Once) Do(f func())
if atomic.LoadUint32(&o.done) == 1
return
// Slow-path.
o.m.Lock()
defer o.m.Unlock()
if o.done == 0
defer atomic.StoreUint32(&o.done, 1)
f()
核心思想是使用原子计数记录被执行的次数。使用Mutex Lock Unlock锁定被执行函数,防止被重复执行。
声明:Nansheng.Su 发表于 2019-05-13 15:51:46 ,共计93字。
转载请署名:go sync.once用法 | www.sunansheng.com
以上是关于go sync.once用法的主要内容,如果未能解决你的问题,请参考以下文章