sync.Once

Easter79
• 阅读 614

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

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

    var confOnce sync.Once
    confOnce.Do(func() {
        log.Println("test")
    })
    confOnce.Do(func() {
        log.Println("test123")
    })

输出结果

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

type Once struct {
    m    Mutex
    done uint32
}

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

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

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

点赞
收藏
评论区
推荐文章
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
科工人 科工人
3年前
go的三个运行基本命令的区别,go run ,go build 和 go install
最近在自学go,遇到点基础的问题,通过自己实际操作之后得出结论在实际操作之前,我们需要知道go有三种源码文件:   1,命令源码文件;声明自己属于main包,并且包含main函数的文件,每个项目只能有一个这样的文件,即程序的入口文件   2,库源码文件;不能直接被执行的源码文件   3,测试源码文件本次操作不涉及测试源码文件。gorun
Wesley13 Wesley13
3年前
java13天
构造函数一个对象的建立,构造函数只运行一次。而一般方法可以被该对象调用多次。personp2newperson();//初始化构造函数p2.p2content();//调用函数的内容,可重复调用构造代码块中定义的是不同对象共性的初始化内容classtest{{System.out.prin
Stella981 Stella981
3年前
SpringBoot+Redis+拦截器+自定义注解实现接口幂等性
一、概念任意多次执行所产生的影响均与一次执行的影响相同。按照这个含义,最终的含义就是对数据库的影响只能是一次性的,不能重复处理。比如:订单接口,不能多次创建订单。支付接口,重复支付同一笔订单只能扣一次钱。支付宝回调接口,可能会多次回调,必须处理重复回调。普通表单提交接口
Stella981 Stella981
3年前
Spring IOC
springioc是spring的核心之一,也是spring体系的基础,那么springioc所依赖的底层技术是什么的?反射,以前我们开发程序的时候对象之间的相互调用需要用new来实现,现在所有的bean都是通过spring容器来管理。这样做有什么好处呢?解耦!以前程序直接的调用用new直接给写死了,现在我们可以通过注入不同的接口实现类来完成对象直接的调
Stella981 Stella981
3年前
Go 源码阅读之 flag 包
Go源码阅读系列是我的源码阅读笔记。因为本人的电脑上Go的版本是1.13.4,所以就选择了该版本作为学习的版本。为此我在Github上Fork了Go的源码,并创建了study1.13.4分支,来记录对于源码的个人理解或者说中文注释也行。每当阅读完一个包后都会进行一下小结,就像这篇是对flag包的总结整理。当然在整理的过程中发现Go夜读
Stella981 Stella981
3年前
Golang- import 导入包的语法
一包的导入语法   在写Go代码的时候经常用到import这个命令用来导入包文件,看到的方式参考如下:   import(     "fmt"   )  然后在代码里面可以通过如下的方式调用   fmt.Println("helloworld")    上面这个fmt是Go语言的
Wesley13 Wesley13
3年前
Go 包的原理和使用
Go包的原理和使用包的引出在实际的开发中,我们往往需要在不同的文件中,去调用其它文件的定义的函数,比如main.go中,去使用utils.go文件中的函数,如何实现?包现在有两个程序员共同开发一个Go项目。程序员xiaoming希望定义函数Cal
Easter79 Easter79
3年前
SpringBoot+Redis+拦截器+自定义注解实现接口幂等性
一、概念任意多次执行所产生的影响均与一次执行的影响相同。按照这个含义,最终的含义就是对数据库的影响只能是一次性的,不能重复处理。比如:订单接口,不能多次创建订单。支付接口,重复支付同一笔订单只能扣一次钱。支付宝回调接口,可能会多次回调,必须处理重复回调。普通表单提交接口
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k