发布时间:2024-12-23 02:45:18
在Go语言(Golang)开发中,单例模式是一种非常常用的设计模式。顾名思义,单例模式即保证一个类只有一个实例,并提供一个全局访问点来获取这个唯一实例。单例模式在某些场景下非常有用,比如数据库连接池、线程池、日志记录器等。接下来,我们将介绍Golang的单例模式并通过实例进行讲解。
懒汉式单例模式是指在实际使用的时候才去创建对象实例。在Golang中,可以利用sync包和Once类型来实现懒汉式单例模式的线程安全。
首先,我们定义一个结构体Singleton,其中包含一个私有变量instance用于保存唯一实例的地址,并定义了GetInstance函数来获取该实例,代码如下:
type Singleton struct {
}
var instance *Singleton
var once sync.Once
func GetInstance() *Singleton {
once.Do(func() {
instance = &Singleton{}
})
return instance
}
饿汉式单例模式与懒汉式不同,它在程序启动时就创建唯一实例。在Golang中,可以通过变量初始化的方式实现饿汉式单例模式。
我们定义一个变量instance,并在init函数中进行实例化,代码如下:
type Singleton struct {
}
var instance = &Singleton{}
func GetInstance() *Singleton {
return instance
}
在懒汉式单例模式中,存在并发访问时实例多次创建的问题。为了解决这个问题,可以使用互斥锁进行线程安全的处理。
我们在懒汉式单例模式的基础上引入一个互斥锁mutex,并在GetInstance函数中对其进行加锁操作,代码如下:
type Singleton struct {
}
var instance *Singleton
var once sync.Once
var mutex sync.Mutex
func GetInstance() *Singleton {
if instance == nil {
mutex.Lock()
defer mutex.Unlock()
if instance == nil {
instance = &Singleton{}
}
}
return instance
}