单例模式
单例模式是最简单的一个模式,不仅有利于减少内存开支,还有减少系统性能开销、防止多个实例产生冲突等优点。用Go语言来简单实现一下。
饿汉式
package testGo
/*
饿汉式
*/
type singleton struct {
}
var instance *singleton = new(singleton)
func GetInstanceOrCreate() *singleton {
return instance
}
懒汉式
懒汉式是我们在项目中经常用到的,实际项目中经常存在线程安全问题,需要加锁
package testGo
import "sync"
type singleton struct {
}
/*
线程安全的懒汉式
*/
var instance *singleton
var lock sync.Mutex
func GetInstanceOrCreate() *singleton {
if instance == nil {
lock.Lock()
//defer 会在函数执行完后执行,相当于java的finally语句
defer lock.Unlock()
if instance == nil {
//使用new方式,结果为指针类型
instance = new(singleton)
}
}
return instance
}
更优雅的方式
package testGo
import "sync"
type singleton struct {
}
/*
更优雅的实现方式(推荐)
*/
var instance *singleton
var once sync.Once
func GetInstanceOrCreate() *singleton {
//once.Do可以确保在并发下只执行一个创建
once.Do(func() {
//使用&方式,结果为指针类型
instance = &singleton{}
})
return instance
}