sync.Once单例
sync.Once单例
在编程的很多场景下我们需要确保某些操作在高并发的场景下只执行一次,例如只加载一次配置文件、只关闭一次通道等。
Go语言中的sync包中提供了一个针对只执行一次场景的解决方案–sync.Once。
sync.Once只有一个Do方法,其签名如下:
func (o *Once) Do(f func()) {}
注意:如果要执行的函数f需要传递参数就需要搭配闭包来使用。
方式一:once.Do
package main
import (
"fmt"
"sync"
)
var once sync.Once
var person *Person
type Person struct {
Name string
}
func NewPerson(name string)*Person {
once.Do(func() {
person = new(Person)
person.Name = name
})
return person
}
func main() {
//p1 := &Person{Name:"hallen1"}
//p2 := &Person{Name:"hallen2"}
//fmt.Printf("%p\n",p1) //0x14000110220
//fmt.Printf("%p\n",p2) // 0x14000110230
p1 := NewPerson("hallen1")
p2 := NewPerson("hallen2")
fmt.Printf("%p\n",p1) // 0x14000010240
fmt.Printf("%p\n",p2) // 0x14000010240
}
方式二:once.Do只执行一次
package main
import (
"fmt"
"sync"
)
var (
once sync.Once
)
func main() {
for i := 0; i < 10; i++ {
once.Do(test)
}
}
func test() {
fmt.Println("111")
}
选择了IT,必定终身学习
posted @ Jeff的技术栈 阅读 (9999+) 评论 (99) 点赞(99) 编辑 MD 收藏
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人