GO: sync.Once

news/2024/12/18 15:00:45/文章来源:https://www.cnblogs.com/niumachen/p/18614976

什么是 sync.Once

sync.Once 是 Go 标准库中的一个结构体,用于确保某些代码只执行一次,无论有多少 goroutine 并发调用。它提供了一个线程安全的机制,保证初始化操作或某些关键代码只执行一次。


通俗解释

可以把 sync.Once 想象成一个保险丝:

  • 第一次触发时,保险丝烧断,代码被执行。
  • 后续触发时,因为保险丝已烧断,代码不再重复执行。

例如:

  • 初始化数据库连接。
  • 加载配置文件。
  • 设置全局变量。

核心方法

sync.Once 的核心方法是:

  • Do(func()):接受一个函数作为参数,保证这个函数只执行一次

使用示例

1. 单次初始化

package mainimport ("fmt""sync"
)var once sync.Oncefunc initialize() {fmt.Println("Initializing...")
}func main() {for i := 0; i < 5; i++ {go once.Do(initialize)}// 等待所有 goroutine 执行完成fmt.Scanln()
}

输出结果

Initializing...

说明

  • 无论有多少 goroutine 并发调用 once.Do(initialize)initialize() 只会执行一次。

2. 应用场景:单例模式

在 Go 中,sync.Once 常用于实现单例模式,确保某个对象只被初始化一次:

package mainimport ("fmt""sync"
)var instance *Singleton
var once sync.Oncetype Singleton struct{}func GetInstance() *Singleton {once.Do(func() {fmt.Println("Creating Singleton instance")instance = &Singleton{}})return instance
}func main() {for i := 0; i < 3; i++ {go func() {_ = GetInstance()}()}// 等待所有 goroutine 执行完成fmt.Scanln()
}

输出结果

Creating Singleton instance

说明

  • 无论 GetInstance() 被调用多少次,Singleton 的实例只会被创建一次。

注意事项

  1. sync.Once 的方法只能调用一次,无法重置:

    • 一旦某个函数通过 Do 被执行,sync.Once 的状态就不可逆转。
  2. Do 内部的函数必须确保不会抛出错误:

    • 如果函数出错,sync.Once 不会再重新执行它,即使逻辑上需要重试。

总结

  • 功能sync.Once 提供了一种线程安全的机制,确保某段代码只执行一次。
  • 适用场景
    1. 初始化操作:如单例模式、加载配置、初始化全局资源等。
    2. 性能优化:避免重复执行耗时的操作。
  • 优点:高效且线程安全,无需手动加锁控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/854820.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二:使用正点原子的直流无刷驱动板自写FOC控制永磁同步(PMSM)电机(位置闭环)

在上一篇博客中配置了UVW三相PWM的定时器,在此基础上增加配置ABZ编码器定时器启用一个定时器中断,用于PID处理 代码如下// 常量定义 #define PI 3.14159265359f #define PWM_RESOLUTION 5250.0f // PWM分辨率 #define CIRCLE_RESOLUTION 1000 // 圆周分辨率 #define MOTOR_…

易基因:游离细胞DNA(cfDNA)检测整体研究方案

01.技术简述 细胞游离DNA(cell-free DNA,cfDNA)是指在生物体的体液中(如血浆、尿液、脑脊液等)自由存在的、非细胞内的DNA片段。这些DNA片段通常来源于细胞凋亡(程序性死亡)或坏死(细胞损伤或死亡后释放),可以被释放到循环系统中,并在体液中被检测到。cfDNA研究和应…

域名历史是什么?怎么进行域名历史查询?

域名是互联网上用来识别和访问网站的一个易于记忆的地址。它将IP地址转换成人类可读的格式,例如 www.example.com。域名是互联网的基础,每个网站都需要一个独特的域名以便用户能够访问。 什么是域名历史? 域名历史记录了一个域名自注册以来的所有变更,包括所有权、DNS设置、…

四款电脑桌面好用的备忘录app推荐,可同步手机

1、sticky notes 这款是Windows系统自带的备忘记事工具,中文名叫“便笺”。点击桌面左下角“开始”,在程序列表中可找到。 它在电脑桌面上是以一张一张彩色便利贴展现的,可以记录简单的文字和图片,非常像纸质便利贴的电子版。 可以通过Office365和手机端同步数据。2、敬业签…

GO 学习笔记之零 (二)git 操作

一、克隆git上仓库指定分支到本地 1、使用 VSCODE 工具详见:GO 学习笔记之一 环境安装 - 夏之夜 - 博客园 文章中的 第四章节的 "导入git项目" 二、git项目本地更改提交到git仓库 1、使用 VSCODE 工具 1.1 工程只有一人开发,不存在冲突的场景点击 VSCODE工具上的“…

写了两个自动化脚本,从下载-构建-打包-提取-备份-更新-重启

##!/bin/bash# 定义颜色用于日志输出 RED=\033[0;31m GREEN=\033[0;32m YELLOW=\033[1;33m NC=\033[0m # No Color# 检查参数 if [ -z "$1" ]; thenecho -e "${RED}错误: 未传入分支号!${NC}"echo "用法: $0 <分支号>"exit 1 fi# 读取分支…

冰雪旅游大爆发:如何优化冰雪旅游管理与服务——看板软件篇

利用板栗看板进行冰雪旅游的旅游管理与运营可以带来诸多便利和效益。通过明确目标与需求、创建项目列表、信息整合与展示、游客管理与服务、数据分析与决策支持以及团队协作与沟通等方面的应用,可以显著提升冰雪旅游的管理效率和服务质量。Wind数据显示,自9月份以来,冰雪旅游…

CI/CD方案:推动智能汽车开发的高效利器

CI/CD方案:推动智能汽车开发的高效利器在智能化和自动驾驶技术飞速发展的背景下,汽车软件开发的复杂性正以前所未有的速度增长。面对市场对效率、质量和快速迭代的高需求,传统开发模式已然捉襟见肘。作为提升开发效率和质量的核心工具,CI/CD(持续集成与持续交付/部署)方案…

说一个使用okhttp的理由

当时公司为了让接入网关变的简单,于是就开发了一个client,然后给各个服务去使用。 有一次发送请求的时候,发现报timeout了,但实际上业务已经执行成功了。于是就去追代码,发现使用的尽然是hutool包的工具,那个真是糊涂呀 。 看代码发现没有指定timeout的参数就使用了默认参…

大学生职业规划模板汇总(大学生职业规划大赛PPT模板)

前言 全国大学生职业规划大赛是由教育部举办的赛事,首届大赛于2023年9月至2024年5月举办,总决赛在上海市举行。生涯教育与就业指导工作贯穿高校招生、培养、就业全过程,是就业指导服务的核心内容、强化价值观引导的重要载体、促进毕业生高质量充分就业的基础工作。以全国大学…

Git错误提交而已,不用慌

Git错误提交而已,不用慌 目录初始化结构1、第一次误提交 提交了错误文件,同时修改1.txt内容为1232、第二次正常提交 修改1.txt内容为456提交记录回滚方式一 git revert 版本号 删除误提交的那一次提交,出现冲突,手动修改冲突文件之后进行提交push操作提交记录回滚方式二 gi…

游戏各部门节日协作,6 款办公软件如何引发效率革命?

在游戏行业的激烈竞争中,冬季作为重要的营销节点,众多游戏公司都力争在这个时期推出新游戏或重大更新,以吸引玩家的目光并抢占市场份额。这一过程犹如一场紧张的冲刺赛,需要开发团队、测试团队、运营团队等多部门密切协作,高效的办公软件则成为了团队加速前进的助推器。本…