Go语言实现单例模式并考虑并发安全
package main
import "sync"
// Singleton结构体定义单例实例
type Singleton struct {
// 这里可以定义单例需要的属性
}
// 定义一个全局变量来保存单例实例
var instance *Singleton
var once sync.Once
// GetInstance函数用于获取单例实例
func GetInstance() *Singleton {
once.Do(func() {
instance = &Singleton{}
})
return instance
}
设计思路
- 使用
sync.Once
: sync.Once
类型的变量once
确保Do
方法中的代码只被执行一次。无论有多少个并发的GetInstance
调用,instance
只会被初始化一次。
- 延迟初始化:在第一次调用
GetInstance
函数时,once.Do
会执行初始化instance
的操作,实现了延迟初始化,避免了程序启动时不必要的初始化开销。
- 线程安全:
sync.Once
内部实现了线程安全机制,保证在并发环境下,单例的初始化操作不会出现竞态条件,从而确保单例模式在并发场景下的正确性。