首页 > 其他分享 >golang sync.Once 保证某个动作仅执行一次的机制

golang sync.Once 保证某个动作仅执行一次的机制

时间:2024-06-10 20:23:50浏览次数:21  
标签:初始化 动作 sync golang done 执行 Once

 

type Once struct {
    done atomic.Uint32
    m Mutex
}

 

这段代码是 Go 语言标准库中 sync 包的一部分,定义了一个 Once 类型。
Once 类型用于确保某个函数只被执行一次。它包含一个 done 原子类型和一个 Mutex 互斥锁。

  

done 表示动作是否已经执行过,它被放置在结构体的最前面,因为它是热路径(频繁调用的代码路径)中使用的。

将 done 放在前面可以在一些架构上生成更紧凑的指令(如amd64/386),在其他架构上则可以减少计算偏移量的指令。

m 是一个互斥锁,用于保护 Once 的状态,确保在多线程环境下的一次性执行。

 

Once 的主要使用场景是初始化,可以避免在多个 goroutine 中对同一资源进行重复初始化。

它的方法 Do(f func()) 用于执行指定的函数f,且仅执行一次。

在 Do 方法中,会通过互斥锁保证并发安全,并使用原子操作来标记动作是否已完成,确保了动作的一次性执行。

总结来说,sync.Once 类型提供了一种保证某个动作仅执行一次的机制,常用于资源的初始化,以防止重复初始化的问题。

 

Link:https://www.cnblogs.com/farwish/p/18240969

标签:初始化,动作,sync,golang,done,执行,Once
From: https://www.cnblogs.com/farwish/p/18240969

相关文章

  • 【四种语言一网打尽(C\C++\Python\Golang)】L1-006 连续因子
    L1-006连续因子一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为3×5×6×7,其中5、6、7就是3个连续的数字。给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。输入格式:输入在一行中给出一个正整数N(1<N<2^31)。输......
  • Golang-编码加密-Xor(GG)
    go语言环境搭建Golang学习日志━━下载及安装_golang下载-CSDN博客  gorunxxx.go  gobuildxxx.go 首先,cs.msf生成比特流数据. 放入xor,py脚本中进行xor加密. xor.pydefxor(shellcode,key):new_shellcode=""key_len=len(key)......
  • defer 属性和 async 属性
    defer属性为了解决脚本文件下载阻塞网页渲染的问题,一个方法是对<script>元素加入defer属性。它的作用是延迟脚本的执行,等到DOM加载生成后,再执行脚本。<scriptsrc="a.js"defer></script><scriptsrc="b.js"defer></script>上面代码中,只有等到DOM加载完成后,才会执......
  • 【四种语言一网打尽(C\C++\Python\Golang)】L1-005 考试座位号
    L1-005考试座位号每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着......
  • 【启程Golang之旅】让文件操作变得简单
    欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了解这门语言的基础知识和实用技巧。目录初识文件IO的引入读取文件写入文件文件复制......
  • JavaScript中的async/await
    async/await是什么?async是一个修饰符,async定义的函数会默认的返回一个Promise对象resolve的值,因此对async函数可以直接进行then操作,返回的值即为then方法的传入函数。await也是一个修饰符,await关键字只能放在async函数内部,await关键字的作用就是获取Promise中返回......
  • Golang递归实现菜单分类
    packagemainimport( "fmt")//Menu菜单typeMenustruct{IDintParentIDintNamestringChildren[]Menu}//TreeList菜单typeTreeListstruct{IDintParentIDintNamestringChildren[]TreeList}//For......
  • go sync.Once
     来自:https://juejin.cn/post/7088305487753510925解析Golangsync.Once用法和原理ag99202022-04-193,650阅读5分钟 一起养成写作习惯!这是我参与「掘金日新计划·4月更文挑战」的第11天,点击查看活动详情。在此前一篇文章中我们了解了sync.Mutex的原理 Golan......
  • Golang学习笔记(1):包管理
    Golang学习笔记(1):包管理本人学习Golang主要是为了做MIT6.824的lab,然而一上来就被Golang神奇的import搞混了,因此写一篇博客记录学习Golang的包管理的过程。packagemainimport"fmt"funcmain(){fmt.Println("hello,world")}如果有编程基础肯定会觉得这段代码很好理......
  • golang select 的 case 执行顺序
    问题:golangselect结构,假如底下有三个case,分别从chan1,chan2,chan3读取内容,chan1,chan2,chan3都是非阻塞的,那么是会先进入第一个case,其它case还会再进入吗?在Go语言中,select语句用于监控多个通道的操作,并在其中一个操作准备好时执行相应的case。如果多个case同......