sync.Once

今天阅读go部分源码的时候发现了一个包sync.Once

那么这个包来干什么的呢?通过百度和查看源码得知sync.Once可以控制函数只能被调用一次。不能多次重复调用。

1 var confOnce sync.Once 2 confOnce.Do(func() { 3 log.Println("test") 4 }) 5 confOnce.Do(func() { 6 log.Println("test123") 7 })

输出结果

2018/05/28 16:37:38 test 并不会打印test123

1type Once struct { 2 m Mutex 3 done uint32 4}

内部有一个锁跟一个计数列。

1func (o *Once) Do(f func()) { 2 if atomic.LoadUint32(&o.done) == 1 { //如果o.done ==1 那么就什么也不执行 3 return 4 } 5 // Slow-path. 6 o.m.Lock() //上锁 7 defer o.m.Unlock() 8 if o.done == 0 { // 不为1 则执行 9 defer atomic.StoreUint32(&o.done, 1) //+1 10 f() //执行函数 11 } 12}

具体实现用途暂时没想到不过看go源码中是用来初始化配置文件的

点赞
收藏

评论区

加载中...

相关推荐

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java13天

构造函数一个对象的建立,构造函数只运行一次。而一般方法可以被该对象调用多次。personp2newperson();//初始化构造函数p2.p2content();//调用函数的内容,可重复调用构造代码块中定义的是不同对象共性的初始化内容classtest{{System.out.prin

go的三个运行基本命令的区别,go run ,go build 和 go install

最近在自学go,遇到点基础的问题,通过自己实际操作之后得出结论在实际操作之前,我们需要知道go有三种源码文件:   1,命令源码文件;声明自己属于main包,并且包含main函数的文件,每个项目只能有一个这样的文件,即程序的入口文件   2,库源码文件;不能直接被执行的源码文件   3,测试源码文件本次操作不涉及测试源码文件。gorun

SpringBoot+Redis+拦截器+自定义注解实现接口幂等性

一、概念任意多次执行所产生的影响均与一次执行的影响相同。按照这个含义,最终的含义就是对数据库的影响只能是一次性的,不能重复处理。比如:订单接口,不能多次创建订单。支付接口,重复支付同一笔订单只能扣一次钱。支付宝回调接口,可能会多次回调,必须处理重复回调。普通表单提交接口

Spring IOC

springioc是spring的核心之一,也是spring体系的基础,那么springioc所依赖的底层技术是什么的?反射,以前我们开发程序的时候对象之间的相互调用需要用new来实现,现在所有的bean都是通过spring容器来管理。这样做有什么好处呢?解耦!以前程序直接的调用用new直接给写死了,现在我们可以通过注入不同的接口实现类来完成对象直接的调