什么是单例?
一个类/结构体在全局,只实例化一个对象。
为什么要有单例?
1、对象重复创建,资源消耗
2、多个对象操作一个资源,出现问题,要求必须时一个对象
如何实现一个单例
整体思路: 实例存在时,直接返回,不存在时创建并返回
关键点:1、并发问题 2、构造函数私有
最容易想到的是下面的实现。但是有个问题,协程并发获取时,仍然会创建多个对象。
package designpattern
import "fmt"
var singleton *Singleton
type Singleton struct {}
func (s *Singleton)GetInstance() *Singleton{
if s == nil {
s = &Singleton{}
return s
}
return s
}
func (s *Singleton)Print() {
fmt.Print("HelloWorld")
}
那获取锁之前,我们直接加个锁好了,是不是就可以解决并发的问题,代码如下
func (s *Singleton) GetInstanceV1() *Singleton {
mutex.Lock()
defer mutex.Unlock()
if s == nil {
s = &Singleton{}
return s
}
return s
}
对象在第一次被创建后,都能够取得到,这个时候锁还有必要吗?加锁是不是浪费了资源?因此,我们想到,只在对象不存在时,加锁。
func (s *Singleton) GetInstanceV2() *Singleton {
if s == nil {
mutex.Lock()
defer mutex.Unlock()
if s == nil {
s = &Singleton{}
return s
}
}
return s
}
todo
go本身的优雅实现
go如果私有化构造函数?目前来看,还是可以直接new一个对象