保证在 Go 程序运行期间的某段代码只会执行一次

func main() {
o := &sync.Once{}
for i := 0; i < 10; i++ {
o.Do(func() {
fmt.Println("only once")
})
}
} $ go run main.go
only once

结构体

type Once struct {
done uint32
m Mutex
}

接口

sync.Once.Do 是 sync.Once 结构体对外唯一暴露的方法,该方法会接收一个入参为空的函数:

如果传入的函数已经执行过,会直接返回;

如果传入的函数没有执行过,会调用 sync.Once.doSlow 执行传入的函数:

func (o *Once) Do(f func()) {
if atomic.LoadUint32(&o.done) == 0 {
o.doSlow(f)
}
} func (o *Once) doSlow(f func()) {
o.m.Lock()
defer o.m.Unlock()
if o.done == 0 {
defer atomic.StoreUint32(&o.done, 1)
f()
}
}

sync.Once的更多相关文章

  1. Gradle project sync failed

    在Android Studio中运行APP时出现了以下错误: gradle project sync failed. please fix your project and try again 解决的 ...

  2. svn sync主从同步学习

    svn备份的方式有三种: 1svnadmin dump 2)svnadmin hotcopy 3)svnsync.  优缺点分析============== 第一种svnadmin dump是官方推荐 ...

  3. ASP.NET sync over async(异步中同步,什么鬼?)

    async/await 是我们在 ASP.NET 应用程序中,写异步代码最常用的两个关键字,使用它俩,我们不需要考虑太多背后的东西,比如异步的原理等等,如果你的 ASP.NET 应用程序是异步到底的, ...

  4. publishing failed with multiple errors resource is out of sync with the file system--转

    原文地址:http://blog.csdn.net/feng1603/article/details/7398266 今天用eclipse部署项目遇到"publishing failed w ...

  5. 解决:eclipse删除工程会弹出一个对话框提示“[project_name]”contains resources that are not in sync with"[workspace_name...\xx\..xx\..\xx]"

    提示“[project_name]”contains resources that are not in sync with"[workspace_name...\xx\..xx\..\xx ...

  6. GitHub for Windows提交失败“failed to sync this branch”

    今天github for windows同步推送远端github出问题了,提交到本地没问题,远端一直推送不上去,挺棘手的,试了几个网上的方法不管用.问题如下,报这个错: failed to sync ...

  7. Android Studio: Failed to sync Gradle project 'xxx' Error:Unable to start the daemon process: could not reserve enough space for object heap.

    创建项目的时候报错: Failed to sync Gradle project 'xxx' Error:Unable to start the daemon process: could not r ...

  8. Go并发控制之sync.WaitGroup

    WaitGroup 会将main goroutine阻塞直到所有的goroutine运行结束,从而达到并发控制的目的.使用方法非常简单,真心佩服创造Golang的大师们! type WaitGroup ...

  9. [译]How to Setup Sync Gateway on Ubuntu如何在ubuntu上安装sync-gateway

    参考文章https://hidekiitakura.com/2015/03/21/how-to-setup-sync-gateway-on-ubuntudigitalocean/ 在此对作者表示感谢 ...

  10. 火狐通行证升级为Firefox Sync后,如何在多设备间同步书签等信息

    一直在使用Firefox的一个比较重要的原因是习惯了它的书签同步功能,之前一直是使用火狐通行证来实现多设备间同步的,最近新装了WIN8.1系统来学习,结果装上新版Firefox之后,发现无论怎么弄也没 ...

随机推荐

  1. Kubernetes(k8s)控制器(一):deployment

    目录 一.系统环境 二.前言 三.Kubernetes 控制器 四.Deployment概览 五.创建deployment 六.修改deploy副本数 6.1 kubectl edit deploy ...

  2. python学习第一周总结

    第一周内容概要 day01 typora软件安装 markdown语法 typora软件功能介绍 网络博文编写教程 计算机的本质 计算机的五大组成部分 计算机的三大核心硬件 day02 操作系统 编程 ...

  3. StartAllBack使用教程

    StartAllBack简介 StartAllBack是一款Win11开始菜单增强工具,为Windows11恢复经典样式的Windows7主题风格开始菜单和任务栏,功能包括:自定义开始菜单样式和操作, ...

  4. 使用Navicat操作MySQL数据库

    一.Navicat连接数据库 ①进入Navicat,由于要使用的是MySQL数据库,选择MySQL ②输入连接名(这个是随便起的) 由上图可知连接数据库的四个要素 host:确定要操作的数据库在哪台电 ...

  5. P33_小程序的页面配置

    页面配置 页面配置文件的作用 小程序中,每个页面都有自己的 .json 配置文件,用来对当前页面的窗口外观.页面效果等进行配置. 页面配置和全局配置的关系 小程序中,app.json 中的 windo ...

  6. ES6的Promise用法

    一.是什么: promise是异步编程的一种解决方案,它是一个对象,可以获取异步操作的信息,它的出现改善了异步编程,避免了地狱回调,它比传统的解决方案回调函数和事件更合理和更强大 二.promise的 ...

  7. PHP封装自定义函数function

    最近一直在看PHP教程,毕竟懂点PHP语言还是不错的选择,起初是准备制作一个三文件夹内关键词组合长尾关键词,然后用PHP做一个全站的动态聚合页面的一个PHP插件,不负有心人啊!已写好,稍晚整理会在资源 ...

  8. WPF ScrollViewer 没有效果

    ScrollViewer组件外组件如果是StackPanel组件 需要给StackPanel 设置高度,ScrollViewer 才会有滚动条 如果不想设置StackPanel高度,可以把StackP ...

  9. Dockerfile构建python项目

    一.步骤 1.镜像基础 2.复制代码 3.设置工作目录 4.把需要执行的shell命令编写成脚本文件 5.配置容器启动自动执行脚本,CMD在docker run时运行脚本 DockerFile 脚本 ...

  10. Ubuntu离线安装 MySQL 5.7

    来源:https://www.ngui.cc/article/show-581968.html?action=onClick 一.所需环境 操作系统:Ubuntu 20.04数据库:MySQL 5.7 ...