-
Go--Sync.Once的应用
sync.Once
常应用于单例模式,例如初始化配置、保持数据库连接等。
init函数通常是所在package首次被加载时执行,如果一直没有被调用就会浪费内存。
sync.Once可以在代码任意位置初始化和调用,因此可以延迟到使用时在执行,并发场景下时线程安全的。(类似于C#中的Lazy语法,懒加载)
在多数情况下,被用于控制变量的初始化,这个变量的读写满足如下三个条件:
- 当且仅当第一次访问某个变量时,进行初始化(写);
- 变量初始化过程中所有都被阻塞,直到初始化完成;
- 变量仅初始化一次,初始化完成后驻留在内存内
原理:
Once结构体只有两个字段
type Once struct {
done uint32
m Mutex
}
sync.Once也只有一个Do方法用于初始化,内部实现就是简单的两点逻辑,①保证我们的变量仅会被初始化一次,源码中通过原子存取一个uint32来判断是否是第一次初始化②保证线程安全并需要支持并发,所以当然这里使用锁机制。
tip:
源码注释中有描述到为何结构体中done是排在第一个,因为这样可以将done在hot path中使用,hot path是程序非常频繁执行的一系列指令,由于sync.Once在大部分场景下都会访问到done,所以放在hot path上可以提升性能。并且结构体的第一个字段的地址和结构体指针是相同的,也就是最常访问的字段放在第一个就在访问时不需要计算偏移,减少CPU的偏移值的加法运算量。
出处:https://www.cnblogs.com/codexiaoyi/p/14907516.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式