ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Go--Sync.Once的应用

2021-06-20 18:36:41  阅读:182  来源: 互联网

标签:初始化 变量 -- Sync sync done Go path 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://geektutu.com/post/hpg-sync-once.html

标签:初始化,变量,--,Sync,sync,done,Go,path,Once
来源: https://www.cnblogs.com/codexiaoyi/p/14907516.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有