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

golang,sync,once · 浏览次数 : 2

小编点评

该段代码是 Go 语言标准库 sync 包的一部分,定义了一个名为 Once 的类型,用于确保某个函数只被执行一次。 Once 结构体包含以下字段: 1. done:表示动作是否已经执行过的原子类型。 2. m:一个互斥锁,用于保护 Once 的状态,以确保在多线程环境下的一次性执行。 Once 类型的主要使用场景是初始化操作,它可以避免在多个goroutine中对同一资源进行重复初始化。 Once 类型提供了 Do 方法,该方法接受一个函数参数 f,并在 Do 方法中执行指定的函数 f,且仅执行一次。Do 方法内部通过互斥锁保证并发安全,并使用原子操作标记动作是否已完成,从而确保动作的一次性执行。 需要注意的是,done 放置于结构体的最前面是为了利用某些架构上生成更紧凑的指令。在其他架构上,合理的计算偏移量可以减少指令。 总结来说,sync.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

与golang sync.Once 保证某个动作仅执行一次的机制相似的内容:

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

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

golang sync.Map 与使用普通的 map 的区别

使用sync.Map与普通的Go map主要有以下几点区别: 1. 并发安全性 普通map: 在没有外部同步的情况下,不是并发安全的。在多goroutine访问时,如果没有适当的锁或其他同步机制保护,可能会导致数据竞争和未定义行为。 sync.Map: 是并发安全的。它内部实现了必要的同步机制,允许

golang 所有关键字的列表及释义归类

golang 所有关键字的列表及释义归类,截至1.18版本。 [控制结构] if : 条件语句,基于布尔表达式的值决定是否执行特定的代码块。 else、 else if : 用在 if 语句之后,当条件表达式为假时执行的代码块。 switch : 多路选择语句,根据不同的情况执行不同的代码块。 ca

golang 泛型的格式写法

Go语言中的泛型(Generics)是在 Go 1.18 版本中引入的一个重要特性,它允许你编写可重用的代码,而不需要为每种数据类型重复编写相同的逻辑。 泛型通过参数化类型(type parameters)来实现,使得函数、方法、接口和结构体可以与多种类型一起工作。 下面详细介绍Go语言中泛型的基本

Golang 依赖注入设计哲学|12.6K 的依赖注入库 wire

本文从“术”层面,讲述“依赖注入”的实现,带你体会其对于整洁架构 & DDD 等设计思想的落地,起到的支撑作用。

[golang]在Gin框架中使用JWT鉴权

什么是JWT JWT,全称 JSON Web Token,是一种开放标准(RFC 7519),用于安全地在双方之间传递信息。尤其适用于身份验证和授权场景。JWT 的设计允许信息在各方之间安全地、 compactly(紧凑地)传输,因为其自身包含了所有需要的认证信息,从而减少了需要查询数据库或会话存储

golang如何使用指针灵活操作内存?unsafe包原理解析

本文将深入探讨Golang中unsafe包的功能和原理。同时,我们学习某种东西,一方面是为了实践运用,另一方面则是出于功利性面试的目的。所以,本文还会为大家介绍unsafe 包的典型应用以及高频面试题。

golang reflect 反射机制的使用场景

Go语言中的 reflect 包提供了运行时反射机制,允许程序在运行时检查和操作任意对象的数据类型和值。 以下是 reflect 包的一些典型使用场景: 1. 动态类型判断与转换:当需要处理多种类型的变量且具体类型直到运行时才能确定时,可以使用反射来检查变量的实际类型,并在可能的情况下进行类型转换。

golang interface 和 struct 添加方法的区别

在 Go 语言中,struct 和 interface 都可以关联方法,但它们的方式不同: 1. struct 添加方法: 结构体(struct)本身不直接包含方法,但可以通过定义一个指向该结构体类型的指针作为接收者的函数来为结构体“添加”方法。 type MyStruct struct { //

golang 的 net/http 和 net/rpc 的区别, rpc 效率比 http 高?

在Go语言中,net/http 和 net/rpc 是两个不同的包,它们分别用于实现不同的网络通信模式: net/http: net/http 包主要用于构建Web服务和客户端,它实现了HTTP协议,这是互联网上最广泛使用的应用层协议之一,主要用于传输超文本(HTML)和其他资源。 HTTP 协议是