Golang单例模式实现
go语言做开始的必然是并发业务,所谓的单例模式也必须加锁否则会不断生成新的实例,不加锁的部分就不写了.
直接记录几个能用的到的单例模式,由浅入深.
懒汉加锁模式
package pattern
import "sync"
type singleton struct{}
var instance *singleton
var mu sync.Mutex
//获取实例
func GetInstance() *singleton {
//这种结构的单例模式,会导致每次都加锁,严重浪费性能
mu.Lock()
defer mu.Unlock()
if instance == nil {
instance = &singleton{}
}
return instance
}
懒汉双重锁检测模式
package pattern
import "sync"
//单例模式
type singleton struct{}
var instance *singleton
var mu sync.Mutex
//获取实例
func GetInstance() *singleton {
//不会导致每次都加锁,因为率先判断了随后才加的锁
//如果没有被实例化
if instance == nil {
//加锁
mu.Lock()
//实例化返回,并解锁
defer mu.Unlock()
//如果没有被实例化
if instance == nil {
instance = &singleton{}
}
}
return instance
}
利用内置的sync.Once来实现
package pattern
import "sync"
//单例模式
type single struct{}
var instance *singleton
//sync.Once能确保实例化对象Do方法在多线程环境只运行一次,内部通过互斥锁实现,它的内部本质上也是双重检查的方式
var lock sync.Once
func GetInstance() *singleton {
lock.Do(func() {
instance = &singleton{}
})
return instance
}
来源:oschina
链接:https://my.oschina.net/chinaliuhan/blog/3165054