go中sync.Once源码解读
sync.Once
前言
本次的代码是基于go version go1.13.15 darwin/amd64
sync.Once的作用
根据名字就大致能猜到这个函数的作用,就是使用sync.once的对象只能执行一次。
我们在errgroup就能看到它的身影
type Group struct {
	cancel func()
	wg sync.WaitGroup
	errOnce sync.Once
	err     error
}
他保证了,只会记录第一个出错的goroutine的错误信息
实现原理
// Once is an object that will perform exactly one action.
type Once struct {
	// 0未执行,1执行了
	done uint32
	// 互斥锁
	m    Mutex
}
里面就一个对外的函数
func (o *Once) Do(f func()) {
	// 原子的读取done的值,如果为0代表onec第一次的执行还没有出发
	if atomic.LoadUint32(&o.done) == 0 {
		// 执行
		o.doSlow(f)
	}
}
func (o *Once) doSlow(f func()) {
	// 加锁
	o.m.Lock()
	defer o.m.Unlock()
	// 判断done变量为0表示还没执行第一次
	if o.done == 0 {
		// 计数器原子的加一
		defer atomic.StoreUint32(&o.done, 1)
		// 执行传入的函数
		f()
	}
}
总结
1、总体上也是很简单一个计数器,一把互斥锁,通过atomic.LoadUint32的原子读取技术器中的值;
2、如果计数器中的值为0表示还没有执行;
3、加锁,执行传入的函数,然后通过atomic.StoreUint32原子的对计数器的值进行加一操作;
4、完成。
go中sync.Once源码解读的更多相关文章
- go中sync.Mutex源码解读
		
互斥锁 前言 什么是sync.Mutex 分析下源码 Lock 位运算 Unlock 总结 参考 互斥锁 前言 本次的代码是基于go version go1.13.15 darwin/amd64 什么 ...
 - go中sync.Cond源码解读
		
sync.Cond 前言 什么是sync.Cond 看下源码 Wait Signal Broadcast 总结 sync.Cond 前言 本次的代码是基于go version go1.13.15 da ...
 - go中semaphore(信号量)源码解读
		
运行时信号量机制 semaphore 前言 作用是什么 几个主要的方法 如何实现 sudog 缓存 acquireSudog releaseSudog semaphore poll_runtime_S ...
 - java jdk 中HashMap的源码解读
		
HashMap是我们在日常写代码时最常用到的一个数据结构,它为我们提供key-value形式的数据存储.同时,它的查询,插入效率都非常高. 在之前的排序算法总结里面里,我大致学习了HashMap的实现 ...
 - Alamofire源码解读系列(四)之参数编码(ParameterEncoding)
		
本篇讲解参数编码的内容 前言 我们在开发中发的每一个请求都是通过URLRequest来进行封装的,可以通过一个URL生成URLRequest.那么如果我有一个参数字典,这个参数字典又是如何从客户端传递 ...
 - JDK容器类Map源码解读
		
java.util.Map接口是JDK1.2开始提供的一个基于键值对的散列表接口,其设计的初衷是为了替换JDK1.0中的java.util.Dictionary抽象类.Dictionary是JDK最初 ...
 - etcd学习(6)-etcd实现raft源码解读
		
etcd中raft实现源码解读 前言 raft实现 看下etcd中的raftexample newRaftNode startRaft serveChannels 领导者选举 启动并初始化node节点 ...
 - 【原】Spark中Job的提交源码解读
		
版权声明:本文为原创文章,未经允许不得转载. Spark程序程序job的运行是通过actions算子触发的,每一个action算子其实是一个runJob方法的运行,详见文章 SparkContex源码 ...
 - HttpServlet中service方法的源码解读
		
前言 最近在看<Head First Servlet & JSP>这本书, 对servlet有了更加深入的理解.今天就来写一篇博客,谈一谈Servlet中一个重要的方法-- ...
 
随机推荐
- 一篇文章图文并茂地带你轻松学完 JavaScript 设计模式(一)
			
JavaScript 设计模式(一) 本文需要读者至少拥有基础的 ES6 知识,包括 Proxy, Reflect 以及 Generator 函数等. 至于这次为什么分了两篇文章,有损传统以及标题的正 ...
 - codeforces 1000C - Covered Points Count 【差分】
			
题目:戳这里 题意:给出n个线段,问被1~n个线段覆盖的点分别有多少. 解题思路: 这题很容易想到排序后维护每个端点被覆盖的线段数,关键是端点值不好处理.比较好的做法是用差分的思想,把闭区间的线段改为 ...
 - Leetcode(17)-电话号码的字母组合
			
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[&quo ...
 - POJ 3415 Common Substrings(后缀数组 + 单调栈)题解
			
题意: 给两个串\(A.B\),问你长度\(>=k\)的有几对公共子串 思路: 先想一个朴素算法: 把\(B\)接在\(A\)后面,然后去跑后缀数组,得到\(height\)数组,那么直接\(r ...
 - nodejs非安装版配置(windows)
			
nodejs官网下载地址: https://nodejs.org/en/download/ 解压到本地并配置环境变量 在环境变量path中新增 D:\develop\node 查看是否配置成功 至此n ...
 - 2015 - 2020 最新 Linux 命令大全
			
# 2015 - 2020 最新 Linux 命令大全 ## VIM 命令模式(Command mode):vi 插入模式(Insert mode):i底线命令模式(Last line mode):e ...
 - Mapbox 地图实验室
			
Mapbox 地图实验室 Learn with Mapbox https://www.mapbox.com/community/education/ https://labs.mapbox.com/e ...
 - Dart & import show & import hide & import as & part & part of
			
Dart & import show & import hide & import as & part & part of // 部分导入,即仅仅导入 dart ...
 - Angular Routing
			
Angular Routing v9.0.7 https://angular.io/start/start-routing
 - robots.txt
			
robots.txt A robots.txt file tells search engine crawlers which pages or files the crawler can or ca ...