经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
Go--Sync.Once的应用
来源:cnblogs  作者:aaayi  时间:2021/6/21 10:09:20  对本文有异议

sync.Once

常应用于单例模式,例如初始化配置、保持数据库连接等。

init函数通常是所在package首次被加载时执行,如果一直没有被调用就会浪费内存。

sync.Once可以在代码任意位置初始化和调用,因此可以延迟到使用时在执行,并发场景下时线程安全的。(类似于C#中的Lazy语法,懒加载)

在多数情况下,被用于控制变量的初始化,这个变量的读写满足如下三个条件:
  • 当且仅当第一次访问某个变量时,进行初始化(写);
  • 变量初始化过程中所有都被阻塞,直到初始化完成;
  • 变量仅初始化一次,初始化完成后驻留在内存内
原理:

Once结构体只有两个字段

  1. type Once struct {
  2. done uint32
  3. m Mutex
  4. }

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

原文链接:http://www.cnblogs.com/codexiaoyi/p/14907516.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号