懒汉模式
这种方式实现起来特别简单,直接判断一个实力是不是为nil, 如果是,则新生成;否则返回已有的。但它和多数语言一样,只适合用在单线程。
- type SingleTon struct {
- }
-
- var instance *SingleTon
-
- func GetInstance() *SingleTon {
- if Instance == nil {
- instance = &SingleTon{}
- }
-
- return instance
- }
使用加锁机制
在Go语言中有个基础对象sync.Mutex,可以实现协程之间的同步逻辑。
- var mu sync.Mutex
-
- func GetInstance() *SingleTon {
- mu.Lock()
- defer mu.Unock()
-
- if Instance == nil {
- instance = &SingleTon{}
- }
-
- return instance
- }
sync.Once用法
在Go中还有一个更简洁的方法就是使用sync.Once,它可以在多协程中起到控制作用。实现起来也非常简单。
- var (
- once sync.Once
- instance *SingleTon
- )
-
- func GetInstance(str string) *SingleTon {
- once.Do(func() {
- instance = &SingleTon{Attr: str}
- })
-
- return instance
- }